P1185智力大冲浪.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
贪心法第2题 智力大冲浪 题目解析: 因为不同的小游戏不能准时完成时具有不同的扣款权数,而且是最优解问题,所以本题很容易就想到了贪心法。 贪心的主要思想是要让扣款数值大的尽量准时完成。 方案1: 即先把所有的数据按照结束时间的先后排序,然后从前向后扫描。 当扫描到第n个时段,发现里面所分配的任务的结束时间等于n-1,那么就说明在前面这些任务中必须舍弃一个,于是再扫描第1~n这n个时段,挑出一个最小的去掉并累加扣款值,然后再去调整排列顺序,让后面的元素填补前面的空缺。 为了使得取得最大价值,在此将所有的游戏按其规定期限进行从小到大排序。希望能够完成足够多的小游戏。 如果当前游戏无法安排下的话,接下来考虑交换论证法。 当前游戏的完成期限肯定比之前所有游戏的任何一个已安排的期限要长,因此可以取代前面安排的任何一个游戏。接下来考察其价值。 比前面已安排游戏中最小的价值还要小,则该游戏就不用取代前面游戏,直接扣其款数。 比前面已安排游戏中最小的价值要大,则取代前面已安排的游戏中最小价值的那个,并将最小价值的游戏不做,扣其款数。 以上使用的贪心方案在操作过程中,任何一个时间片段内,均能取得最优方案,能做到步步优先,因而该算法就最优的! program riddle; type data=record tim,val:longint; end; arr=array[1..500]of data; var a:arr; i,j,k,t,m,n,min:longint; procedure qsort(var a:arr; l,r:longint); var i,j,m:longint; t:data; begin i:=l; j:=r; m:=a[(i+j)div 2].tim; {此处m一定为具体元素值,不可仅保存其下标,因为其下标指向的值可能发生变化} repeat while a[i].timm do inc(i); while ma[j].tim do dec(j); if i=j then begin t:=a[i]; a[i]:=a[j]; a[j]:=t; inc(i); dec(j); end; until ij; if lj then qsort(a,l,j); if ir then qsort(a,i,r); end; begin assign(input,riddle.in); reset(input); readln(m); readln(n); for i:=1 to n do read(a[i].tim); readln; for i:=1 to n do read(a[i].val); readln; close(input); qsort(a,1,n); j:=1; t:=1; {j指向数组元素列表下标,t表示当前将安排的任务是第几个} repeat while a[j].tim=t do begin inc(j); inc(t); end; if jn then break; {所有的任务全部考察过} k:=0; {存在无法安排下的任务j} min:=maxint; {在第j个任务之前找找看,并找出已安排任务中最小的价值的那个值,保存到min变量中,下标为k,未安排的任务会自动过滤掉的,因为其值已被设为maxint} for i:=1 to j-1 do if (a[i].valmin) then begin k:=i; min:=a[i].val; end; {分两种情况考虑: 最小价值指向的任务比当前j指向的任务的价值要大 最小价值指向的任务比当前j指向的任务的价值要小 } if a[k].val=a[j].val then begin dec(m,a[j].val); a[j].val:=maxint; inc(j); continue; end {1} else begin {情况2} dec(m,a[k].val); a[k].val:=maxint; inc(j);

文档评论(0)

海川电子书城 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档