- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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);
您可能关注的文档
最近下载
- 头皮知识课件.pptx VIP
- 2025年安徽省普通高中学业水平合格性考试信息技术和通用技术上机真题卷3.docx VIP
- 第五章第二节创新实验:铜与硝酸 说课稿 2023-2024学年高一下学期化学人教版(2019)必修第二册.docx VIP
- 2025第九届“学宪法、讲宪法”知识竞赛题库(+答案解析)(中小学组).docx VIP
- 数据挖掘与机器学习全套教学课件.pptx
- 哈希cod_max_培训教材.ppt VIP
- 第五章第二节创新实验:铜与硝酸 教学设计 2023-2024学年高一下学期化学人教版(2019)必修第二册.docx VIP
- 建筑项目设计与施工配合措施.docx VIP
- 2025年辅警考试题库公安辅警.doc VIP
- 中国银行存款证明 正面资料.doc VIP
文档评论(0)