時間限制: 1 s
空間限制: 128000 kb
題目等級 : ** gold
題解卡門——農夫約翰極其珍視的一條holsteins奶牛——已經落了到「垃圾井」中。「垃圾井」是農夫們扔垃圾的地方,它的深度為d (2 <= d <= 100)英呎。
卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。
每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門的時間。
假設卡門預先知道了每個垃圾扔下的時間t(0輸入描述 input description
第一行為2個整數,d 和 g (1 <= g <= 100),g為被投入井的垃圾的數量。
第二到第g+1行每行包括3個整數:t (0 < t <= 1000),表示垃圾被投進井中的時間;f (1 <= f <= 30),表示該垃圾能維持卡門生命的時間;和 h (1 <= h <= 25),該垃圾能墊高的高度。
輸出描述 output description
如果卡門可以爬出陷阱,輸出乙個整表示最早什麼時候可以爬出;否則輸出卡門最長可以存活多長時間。
樣例輸入 sample input
20 4
5 4 9
9 3 2
12 6 10
13 1 1
樣例輸出 sample output
資料範圍及提示 data size & hint
[樣例說明]
卡門堆放她收到的第乙個垃圾:height=9;
卡門吃掉她收到的第二個垃圾,使她的生命從10小時延伸到13小時;
卡門堆放第3個垃圾,height=19;
卡門堆放第4個垃圾,height=20。
分類標籤 tags 點此展開
暫無標籤
ac**+解釋:
/*首先按照投放垃圾的時間排序;
f[i]表示堆放的垃圾高度為i時卡門最長的存活時間;
每次的判斷條件是能存活的時間是否大於垃圾投放的時間,如果不是卡門就要餓死了;
還有就是垃圾的高度有沒有大於或等於陷阱的高度,如果是的話就可以爬出來了;
對待每乙個垃圾,吃或者堆,那麼就有兩個式子:
f[j+a[i].h]=max(f[j+a[i].h],f[j]);//堆
f[j]+=a[i].f;//吃
如果爬不出去,那麼存活的最長時間就是f[0],也就是把所有的垃圾全吃了; */
#include
#include
#include
#include
#include
using
namespace
std;
const
int n=1001
;struct
nodea[n];
intd,g,f[n];
bool si=1
;bool cmp(const node &x,const node &b)
intmain()
f[j+a[i].h]=max(f[j+a[i].h],f[j]);//
不吃 f[j]=f[j]+a[i].f;//吃}
}}
printf("%d
",f[0
]);
return0;
}
洛谷 1156 垃圾陷阱
作為一道藍色的dp神題,它成功把我卡了兩個小時。這個題對我來說確實有些困難,本人太菜了,對dp毫無感覺。後來發現這是個揹包,要麼吃要麼放,前提是餓不死。於是 ac include include include include using namespace std inline intread i...
P1156 垃圾陷阱
這是一道揹包,但是對於放東西有條件限制 首先思考,對於每乙個物品,除非放不了,否則就要放,不放上就吃掉,肯定不能扔那不管 我們定義dp i j 為第i個物品,高度為j的時候能活的最長時間,那麼整個轉移過程就是 for int i 1 i g i ans max ans,dp i 0 最大時間肯定是全...
《訓練賽》 垃圾陷阱
時間限制 1 sec 記憶體限制 128 mb 提交 78 解決 38 提交 狀態 討論版 卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,...