1684 垃圾陷阱

2022-05-03 10:57:15 字數 1694 閱讀 3375

時間限制: 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 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,...