• 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;
    }
  • 相关阅读:
    [转]检查浏览器是否支持javascript和cookie
    Ruby语法学习
    [转]Office Word 2007鼠标操作无效
    JS选择图片,显示缩略图
    IE开发工具条IEDevToolBar下载
    [转]120个 Web 开发工具 (下)
    JQuery收藏
    [转]120个 Web 开发工具 (上)
    [转]GridView自动序号
    [转]GridView 常用事件删除,更新,删除,取消等
  • 原文地址:https://www.cnblogs.com/zeroform/p/7663348.html
Copyright © 2020-2023  润新知