垃圾陷阱 洛谷1156 dp

来源:互联网 发布:Windows7远程端口设置 编辑:程序博客网 时间:2024/06/11 07:21

题目描述

卡门――农夫约翰极其珍视的一条Holsteins奶牛――已经落了到“垃圾井”中。“垃圾井”是农夫们扔垃圾的地方,它的深度为D(2<=D<=100)英尺。

卡门想把垃圾堆起来,等到堆得与井同样高时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。

每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。

假设卡门预先知道了每个垃圾扔下的时间t(0< t<=1000),以及每个垃圾堆放的高度h(1<=h<=25)和吃进该垃圾能维持生命的时间f(1<=f<=30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续10小时的能量,如果卡门10小时内没有进食,卡门就将饿死。

分析

谢谢老伙计提供的水题~~

dp[i]表示堆了i的高度能活多久

1.堆起来的话就是dp[i+h]=max(dp[i+h],dp[i])

2.吃掉dp[i]=dp[i]+f

初值dp[0]=10,若出不去就输出dp[0]了

ps:以时间为关键字把数据排序。

偷懒中233

code

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<string>#include<algorithm>using namespace std;int dp[10000];struct arr{    int x,y,w;}a[10000];int n,m;int main(){    scanf("%d%d",&n,&m);    for (int i=1;i<=m;i++)    {        scanf("%d%d%d",&a[i].w,&a[i].x,&a[i].y);    }    for (int i=1;i<=m-1;i++)        for (int j=i+1;j<=m;j++)            if (a[i].w>a[j].w)            {                arr k;                k=a[i];                a[i]=a[j];                a[j]=k;            }     dp[0]=10;    for (int i=1;i<=m;i++)    {        for (int j=n;j>=0;j--)        {            if (dp[j]>=a[i].w)            {                if (j+a[i].y>=n)                {                    printf("%d",a[i].w);                    return 0;                 }                  dp[j+a[i].y]=max(dp[j+a[i].y],dp[j]);                dp[j]=dp[j]+a[i].x;            }         }    }    printf("%d",dp[0]);    return 0;} 
0 0
原创粉丝点击