- 1、本文档共15页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8月22日贪心法课件
均分纸牌
[问题描述]? 有N堆纸牌,编号分别为1,2,….N。每堆上有若干张, 但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为1堆上取的纸牌,只能移到编号为2的堆上;在编号为N的堆上取的纸牌,只能移到编号为N-1的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如N=4,4堆纸牌数分别为:
① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的:从③取4张牌放到④(9 8 13 10)→从③取3张牌放到②(9 11 10 10)→从②取1张牌放到①(10 10 10 10)。
[ 输 入 ]: N ( N 堆纸牌,1≤N≤100)
A1,A2,….An (N 堆纸牌,每堆纸牌初始数,1≤Ai≤10000)
[ 输 出 ]:所有堆均达到相等时的最少移动次数。
[输入输出样例];输入:
4
9 8 17 6
;问题是,在从第i+1堆中取出纸牌补充第i堆的过程中,可能会出现第i+1堆的纸牌数小于零(list[i+1]-(ave-list[i])0 )的情况,这时可以理解为一个“先出后进”的栈。由于纸牌的总数是n的倍数,因此后面的堆会补充第i+1堆ave-list[i]-list[i+1]+ ave张纸牌,使其达到均分的要求。 ;任务调度问题;定义两个概念:;例如
任务i 1 2 3 4 5 6 7
期限di 4 2 4 3 1 4 6
罚款wi 70 60 50 40 30 20 10
最初,我们设所有n个时间空位都是空的。然后按罚款的单调递减顺序(任务1,任务2,任务3,任务4,任务5,任务6,任务7)来考虑各个子任务。在考虑任务j时,如果有一个恰处于或前于dj 的时间空位仍空着,则将任务j赋与最近的这样的空位,并填入;如果不存在这样的空位,则将任务j赋与一个还未被占的、最近的空位。
按上述贪心策略选择了任务1,2,3,4,7,放弃任务5,6。最终的最优调度为〈2,3,4,1,7,5,6〉,其总的罚款为W5 +W6 =50
;设N─任务个数,num─目前早任务个数;t─罚款总和
list─任务序列。其中list[i].k、 list[i].d、 list[i].w为任务I的编号,期限和罚款。 list[i].k0,则任务i为早任务;list[i].k0,则任务i为迟任务;lt─辅助数组
Pck为早任务的编号序列;
算法如下:
读入任务数N;
For i := 1 to N Do
Begin
读入任务i的期限List[i].d和罚款List[i].w;
List[i].k := I{记下其序号}
End;{for}
list序列按罚款单调递减的顺序排序 ;
?
;num := 0;
For i := 1 to N Do Begin{依次处理每一个任务}
t := 0;{统计目前num个早任务中期限小于等于num的任务个数t}
For j := 1 to num Do
If List[Pck[j]].d = num Then Inc(t);
If t List[i].d Then Begin{若有一个恰处于或前于第j个任务期限的时间空位,则早任务个数+1;任务i进入早任务集合}
Inc(num);Pck[num] := i; List[i].k := - List[i].k;{设任务i为早任务标志}
j := num;{将早任务按期限递增顺序排列}
While (j 1) And (List[Pck[j]].d List[Pck[j - 1]].d) Do
Begin t := Pck[j]; Pck[j] := Pck[j - 1]; Pck[j - 1] := t;Dec(j); End{while}
End{then}
End;{for}
For i := 1 to num Do打印第I个早任务的序号- List[Pck[i]].k;
t := 0;{打印所有迟任务并累计罚款总和}
For i := 1 to N Do If List[i].k 0 Then Begin打印迟任务的序号List[i].k;
t := t + List[i].w;End;{then}
输出总
您可能关注的文档
- 机械原理设计综合课程设计课件.ppt
- 机械原理课程设计(VB版)2010机制课件.ppt
- 机械故障诊断技术绪论课件.ppt
- 机械效率习题精选课件.ppt
- 机械手组态课程设计课件.ppt
- 机械安全技术复习题课件.ppt
- 机械设计基础之机械设计复习课件.ppt
- 重叠需求理论.ppt
- 机电交底会议内容课件.ppt
- 机电传动控制考试重点总结课件.ppt
- 中国多次直拉单晶炉行业市场占有率及投资前景预测分析报告.pdf
- 中国多功能阀门行业市场占有率及投资前景预测分析报告.pdf
- 中国多工位直接成衣打印机行业市场占有率及投资前景预测分析报告.pdf
- 部编版九年级下册语文详细教学计划及教学进度安排.docx
- 宁夏吴忠市同心县四校2024-2025学年高一上学期期末联考试地理试题(解析版).docx
- 中国多点平均温度计行业市场占有率及投资前景预测分析报告.pdf
- 2024年重庆市高考物理试题含答案解析.docx
- 2024年天津市高考政治试题含答案解析.docx
- 2024年天津市高考物理试题含答案解析.docx
- 中国多弹簧泥浆密封行业市场占有率及投资前景预测分析报告.pdf
文档评论(0)