動規仍然是難關啊
卡門――農夫約翰極其珍視的一條holsteins奶牛――已經落了到「垃圾井」中。「垃圾井」是農夫們扔垃圾的地方,它的深度為d(2<=d<=100)英呎。
卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。
每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門的時間。
假設卡門預先知道了每個垃圾扔下的時間t(0< t<=1000),以及每個垃圾堆放的高度h(1<=h<=25)和吃進該垃圾能維持生命的時間f(1<=f<=30),要求出卡門最早能逃出井外的時間,假設卡門當前體內有足夠持續10小時的能量,如果卡門10小時內沒有進食,卡門就將餓死。
輸入格式:
第一行為2個整數,d 和 g (1 <= g <= 100),g為被投入井的垃圾的數量。
第二到第g+1行每行包括3個整數:t (0 < t <= 1000),表示垃圾被投進井中的時間;f (1 <= f <= 30),表示該垃圾能維持卡門生命的時間;和 h (1 <= h <= 25),該垃圾能墊高的高度。
輸出格式:
如果卡門可以爬出陷阱,輸出乙個整表示最早什麼時候可以爬出;否則輸出卡門最長可以存活多長時間。
輸入樣例#1:
20 45 4 9
9 3 2
12 6 10
13 1 1
輸出樣例#1:
13
[樣例說明]
卡門堆放她收到的第乙個垃圾:height=9;
卡門吃掉她收到的第二個垃圾,使她的生命從10小時延伸到13小時;
卡門堆放第3個垃圾,height=19;
卡門堆放第4個垃圾,height=20。
可以優化到一維
f[時間]=高度 (也有時間和高度調換的做法),對於每個垃圾決策吃或者不吃
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7int dp[4000];//
[時間]=高度
8int
d,g;
9struct
rbr[200
];12
int ans=100000;13
int anstime=0;14
bool flag=0;15
intcmp(rb a,rb b)
18int
main()
25 sort(r+1,r+g+1
,cmp);
26 dp[10]=0;27
for(i=1;i<=g;i++)
32//
printf("%d %d\n",i,dp[r[i].t]);
33for(j=r[g].t+r[i].f;j>=r[i].t;j--)38}
39}40//
處理出不去的情況:吃掉所有垃圾
41int ans=10;i=1;42
while(ans>=r[i].t && i<=g)
46 printf("%d"
,ans);
47return0;
48 }
洛谷 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...