洛谷P1156 垃圾陷阱

2022-05-29 07:54:10 字數 2139 閱讀 9205

這個題是乙個類似揹包問題,垃圾的高度看成物重,能增加的生命的長短看成價值,把井的高度看成揹包的大小,但和揹包不同的是,題目要求至少將這個揹包填滿,需要對**進行以下修改

開乙個結構體(記錄)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:

#includestruct

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;

}

pascal:

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...