P1156 垃圾陷阱

2022-04-29 03:06:11 字數 1784 閱讀 7780

設 f [ i ][ j ] 表示,扔進去 i 個垃圾,垃圾高度為 j 時,奶牛的生命值。

初始化 f 陣列為 -1,因為當奶牛生命值為 0 時,奶牛還是可以操縱垃圾。f [ 0 ][ 0 ] = 10 為奶牛的初始生命值。

轉移如下:

① 當 f [ i ][ j ] < 0 時,說明這個狀態奶牛已經死了,跳過。

② 當 f [ i ][ j ] = 0 時,奶牛處於瀕死狀態,還可以操作,必須吃掉垃圾。進而判斷這個垃圾恢復的生命值是否能夠支撐到下乙個垃圾的投入,若不能,就跳過,否則就轉移狀態。

③ 當 f [ i ][ j ] > 0 時,判斷奶牛不吃這個垃圾的生命值能否支撐到下乙個垃圾的投入,能,就把垃圾堆起來。不能,就吃掉。吃掉後再判斷能否轉移,同 ② 。

偽**:

struct

hht[maxn];

f[0][0]=10

;for(ll i=0;i//

第一重迴圈,列舉投入的垃圾

for(ll j=0;j<=d;j++)//

列舉高度

if(f[i][j]-t[i+1].tim+t[i].tim>=0)//

同時判斷、轉移②,③兩種情況

}

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lck_max(a,b) ((a)>(b)?(a):(b))

#define lck_min(a,b) ((a)<(b)?(a):(b))typedef

long

long

ll;#define maxn 1001ll d,g,ans,las,f[maxn][maxn];

struct

hht[maxn];

inline ll read()

while

(isdigit(ls))

return xs*kr;

}inline

void

out(ll xs)

if(xs<0) putchar('

-'),xs=-xs;

int kr[57],ls=0

;

while(xs) kr[++ls]=xs%10,xs/=10

;

while(ls) putchar(kr[ls]+48),ls--;

}inline

bool cmp(const hh&a,const hh&b)

intmain()

sort(t+1,t+g+1

,cmp);

memset(f,-1,sizeof

(f));

f[0][0]=10

;

for(ll i=0;i)

for(ll j=0;j<=d;j++)

if(f[i][j]-t[i+1].tim+t[i].tim>=0

)

}for(ll i=1;i<=g;i++)

ans+=f[0][0

];

out(ans);

return0;

}

P1156 垃圾陷阱

這是一道揹包,但是對於放東西有條件限制 首先思考,對於每乙個物品,除非放不了,否則就要放,不放上就吃掉,肯定不能扔那不管 我們定義dp i j 為第i個物品,高度為j的時候能活的最長時間,那麼整個轉移過程就是 for int i 1 i g i ans max ans,dp i 0 最大時間肯定是全...

P1156 垃圾陷阱

一道dp難題 鑑於我最近學了dp,所以就在訓練裡找了到dp題 在debug乙個多小時之後,我發現好水好難啊!上連線 p1156 乙隻腦殘奶牛把自己弄到深度為d的垃圾井裡,而且它一開始只能活10小時,所以它莫名其妙知道了垃圾倒下的t 時間 和h 高度 對於每個垃圾,它要麼吃了 口區 要麼堆高高,從而逃...

洛谷 P1156 垃圾陷阱

卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門...