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;
}
原文地址:https://www.cnblogs.com/zeroform/p/7663348.html