卡門――農夫約翰極其珍視的一條holsteins
奶牛――已經落了到「垃圾井」中。「垃圾井」是農夫們扔垃圾的地方,它的深度為d(2≤d≤100)英呎。
卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。
每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門的時間。
假設卡門預先知道了每個垃圾扔下的時間t(0輸入格式:
第一行為2個整數,d和g(1≤g≤100),g為被投入井的垃圾的數量。
第二到第g+1行每行包括3個整數:t(0輸出格式:
如果卡門可以爬出陷阱,輸出乙個整表示最早什麼時候可以爬出;否則輸出卡門最長可以存活多長時間。
輸入樣例#1:
20 45 4 9
9 3 2
12 6 10
13 1 1
輸出樣例#1:
13
[樣例說明]
卡門堆放她收到的第乙個垃圾:height=9;
卡門吃掉她收到的第2個垃圾,使她的生命從10小時延伸到13小時;
卡門堆放第3個垃圾,height=19;
卡門堆放第4個垃圾,height=20。
解題思路:
一道dp題,用f陣列儲存狀態,其中f[i]表示垃圾堆高度為i時的最大生命,迴圈d~0,如果這個高度的生命值不小於這個垃圾丟下來的時間,並且如果 高度+這個垃圾的高度不小於d,說明卡門可以出來了,就輸出這個垃圾丟下來的時間,否則 這個高度+這個垃圾的高度 的生命值=max(f[d~0]),即不吃垃圾用它來堆,此時高度+=這個垃圾的高度,這個高度的生命值+=吃這個垃圾增長的生命值,即吃垃圾,此時高度不變,最後輸出f[0],表示最長存活時間.
ac**:
1 #include2 #include3using
namespace
std;
4int d,g,f[105];5
struct
kkk e[105];8
bool cmp(kkk a,kkk b)
11int
main()
24 f[j+e[i].h] = max(f[j+e[i].h],f[j]);//
狀態轉移
25 f[j] += e[i].f;//
狀態轉移 26}
27 printf("
%d",f[0]);//
如果他無論如何也出不去,就輸出最長存活時間
28return0;
29 }
洛谷P1156 垃圾陷阱
動規仍然是難關啊 卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆...
洛谷P1156 垃圾陷阱
這個題是乙個類似揹包問題,垃圾的高度看成物重,能增加的生命的長短看成價值,把井的高度看成揹包的大小,但和揹包不同的是,題目要求至少將這個揹包填滿,需要對 進行以下修改 開乙個結構體 記錄 a i t,a i f,a i h分別代表第i個物體的投入時間,持續生命時間和高度。設b j 表示到達高度j時所...
洛谷 P1156 垃圾陷阱
一頭牛被困在垃圾井中,要通過垃圾來維持生命,或堆高來逃出垃圾井 有n個垃圾,知道扔下的時間,堆放的高度,維持生命的時間,求逃出井的時間或最長存活時間 揹包。把垃圾的高度看成物重,維持生命的時間看成價值,把井的高度看成包的大小。include include include int d,g,ans 1...