作业帮 > 综合 > 作业

pascal垃圾陷阱卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。“垃圾井”是农夫们扔

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/25 13:02:51
pascal垃圾陷阱
卡门——农夫约翰极其珍视的一条Holsteins奶牛——已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D (2 <= D <= 100)英尺。
卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。
每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。
假设卡门预先知道了每个垃圾扔下的时间t(0输入格式:
第一行为2个整数,D 和 G (1 <= G <= 100),G为被投入井的垃圾的数量。
第二到第G+1行每行包括3个整数:T (0 < T <= 1000),表示垃圾被投进井中的时间;F (1 <= F <= 30),表示该垃圾能维持卡门生命的时间;和 H (1 <= H <= 25),该垃圾能垫高的高度。
输出格式:
如果卡门可以爬出陷阱,输出一个整表示最早什么时候可以爬出;否则输出卡门最长可以存活多长时间。
样例输入:
20 4
5 4 9
9 3 2
12 6 10
13 1 1
样例输出:
13
数据范围:
0 < T <= 1000
1 <= F <= 30
1 <= H <= 25
提示:
[样例说明]
卡门堆放她收到的第一个垃圾:height=9;
卡门吃掉她收到的第二个垃圾,使她的生命从10小时延伸到13小时;
卡门堆放第3个垃圾,height=19;
卡门堆放第4个垃圾,height=20。
code:
program lj;
var
i,j,k,l,ans,maxf,maxh,d,g,n,t:longint;
f,h:longint;
b:array[0..110,0..1100,0..110] of boolean;
begin
readln(d,g);
for i:=0 to 10 do b[0,i,0]:=true;
maxf:=maxlongint;
for k:=1 to g do begin
readln(t,f,h);
if maxf maxf:=0;
maxh:=0;
for i:=0 to 1031 do
for j:=0 to 100 do begin
if b[k-1,i,j] then begin b[k,i+f,j]:=true; b[k,i,j+h]:=true; if maxf=t) and (maxh end;
if maxh>=d then begin writeln(t); exit; end;
end;
end.
为什么错?
运行你的程序,结果正确,但不易读懂。下面用数组模拟二叉树的方法求解,相当于暴力破解,只是规模比题中的要求大大缩小了。
uses math;
label 999;
var
inn:array[0..10,1..3] of integer;
{垃圾数组,扔垃圾时间、维持寿命长度、堆积高度}
bi:array[0..10,1..1024,1..2] of integer;
{三维模拟二叉树数组} {第3维:距地面深度、存活时间}
{因为列数是行数的2^i,所以本方法g=0 then bi[i,j,2]:=t+inn[i,2] else bi[i,j,2]:=-999;
end
else begin
bi[i,j,1]:=bi[i-1,(j+1) div 2,1]-inn[i,3];
bi[i,j,2]:=bi[i-1,(j+1) div 2,2]-(inn[i,1]-inn[i-1,1]);
end;
write(bi[i,j,1]:5, bi[i,j,2]:5);
write(ff,bi[i,j,1]:5, bi[i,j,2]:5);
if (bi[i,j,1]=0) then begin
solution:=inn[i,1];
goto 999;
end;
end;
writeln;
writeln(ff);
end;
999:
writeln(ff,solution);
close(ff);
writeln;
writeln(solution);
if solution=0 then begin
for i:=1 to g do solution:=solution+inn[i,2];
writeln('存活时间=',solution+10);
end;
end.