luogu P1156 垃圾陷阱
原题链接:https://www.luogu.org/problem/show?pid=1156
经历了一次CE,两次WA 45,一次WA 91,终于A掉了此题。
f[i][j]表示前i个物品堆成j高度时的生命值。
对于每一件物品,都有吃掉或是把它堆起来两种方案。
如果奶牛坚持不到吃到下一个物品,那么就无需进行此次转移。
而如果不吃而将其堆起来,高度超过了井的深度,那么由于是1—n枚举的,所以此时的时间就是最快脱逃的时间,
而如果堆起来不能超过深度的话,就要同时考虑两种选择。
如果将其吃掉,那么f[i][j]=max(f[i-1][j]+p[i].e,f[i][j])
而将其堆起来的话,f[i][j+p[i].h]=max(f[i][j+p[i].h],f[i-1][j])
如果始终无法到达,那么就不妨选择全部吃掉,直到全部吃完或是坚持不到吃到下一个。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct th { int t,e,h; }p[105]; bool cmp(th x,th y) { return x.t<y.t; } int max(int x,int y) { return x>y?x:y; } int h,n,f[1005][1005],t; int main() { scanf("%d %d",&h,&n); for(int i=1;i<=n;i++) scanf("%d %d %d",&p[i].t,&p[i].e,&p[i].h); sort(p+1,p+n+1,cmp); f[0][0]=10; for(int i=1;i<=n;i++)//i j hp { for(int j=0;j<=h;j++) { if(f[i-1][j]<p[i].t) continue; if(p[i].h+j>=h) { printf("%d",p[i].t); return 0; } f[i][j]=max(f[i][j],f[i-1][j]+p[i].e); f[i][j+p[i].h]=max(f[i][j+p[i].h],f[i-1][j]); } } for(int i=1;i<=n;i++) t=max(t,f[i][0]); printf("%d",t); return 0; }