這個題是乙個類似揹包問題,垃圾的高度看成物重,能增加的生命的長短看成價值,把井的高度看成揹包的大小,但和揹包不同的是,題目要求至少將這個揹包填滿,需要對**進行以下修改
開乙個結構體(記錄)a[i].t,a[i].f,a[i].h分別代表第i個物體的投入時間,持續生命時間和高度。
設b[j]表示到達高度j時所擁有的最長的生命時間,注意b[0]=10。
那麼轉態轉移應該是if(b[j]>b[j+a[i].h])b[j+a[i].h]=b[j];
如果有乙個j+a[i].h>=d,那麼就代表走出去了,
如果迴圈完了還沒走出去就應該輸出最長存活的時間。
下面是**:
c:
#includestructpascal:sja[
1001
];int b[1001
];int
d,g;
void px(int k,int
s) }
while(i<=j);
if(i
if(k
}int
main();
if(b[j]>b[j+a[i].h])b[j+a[i].h]=b[j];
b[j]+=a[i].f;
}printf("%d
",b[0
]);
return0;
}
type sj=record如果有什麼問題,請指出,謝謝。t:integer;
f:integer;
h:integer;
end;
vara:
array[0..1000]of
sj; b:
array[0..1000]of
integer;
d:integer;
g:integer;
procedure
px(k,s:integer);
vari:integer;
j:integer;
mid:integer;
p:sj;
begin
i:=k;j:=s;
mid:=a[(k+s) div
2].t;
while i<=j do
begin
while a[i].tdo i:=i+1
;
while a[j].t>mid do j:=j-1
;
if i<=j then
begin
p:=a[i];
a[i]:=a[j];
a[j]:=p;
i:=i+1
; j:=j-1
;
end;
end;
if ithen
px(i,s);
if kthen
px(k,j);
end;
vari:integer;
j:integer;
begin
readln(d,g);
for i:=1
to g do
readln(a[i].t,a[i].f,a[i].h);
px(1,g);
b[0]:=10
;
for i:=1
to g do
for j:=d downto0do
if b[j]>=a[i].t then
begin
if j+a[i].h>=d then
begin
writeln(a[i].t);exit();
end;
if b[j]>b[j+a[i].h] then b[j+a[i].h]:=b[j];
b[j]:=b[j]+a[i].f;
end;
writeln(b[
0]);
end.
洛谷 P1156 垃圾陷阱
卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門...
洛谷P1156 垃圾陷阱
動規仍然是難關啊 卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆...
洛谷 P1156 垃圾陷阱
一頭牛被困在垃圾井中,要通過垃圾來維持生命,或堆高來逃出垃圾井 有n個垃圾,知道扔下的時間,堆放的高度,維持生命的時間,求逃出井的時間或最長存活時間 揹包。把垃圾的高度看成物重,維持生命的時間看成價值,把井的高度看成包的大小。include include include int d,g,ans 1...