Trapped in the Well (01背包变形)

题目链接:oj22858

题意:给一个井的深度,再给你G个垃圾,每个垃圾有其到达时间,吃掉这垃圾能延长寿命时间或者用这个垃圾来垒成梯子,人初始时间为10。问:最快什么时间能逃离,要是不能逃离,存活最晚的时间是多少?

 

题解:01背包变形。参考集训队大佬帅辉的思路,牛逼。

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

struct node{
    int t,f,h;
}ans[110];
bool cmp(node a,node b){
    return a.t<b.t;
}
int dp[5000];///定义高度为i,存活时间为

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(dp,0,sizeof(dp));

    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&ans[i].t,&ans[i].f,&ans[i].h);
    }
    sort(ans+1,ans+1+m,cmp);

    dp[0]=10;///初始化,高度为0,能存活的时间
    bool flag=1;
    for(int i=1;i<=m&&flag;i++)
    {
        for(int j=n;j>=0;j--)///01背包从大往后
        {
            if(dp[j]>=ans[i].t) ///当前高度存活的时间大于垃圾到来的时间
            {
                if(j+ans[i].h>=n){///如果此时加上垃圾到来的高度已经满足结果,那么此时一定是最短时间
                    printf("%d\n",ans[i].t);
                    flag=0;break;
                }
                dp[j+ans[i].h]=max(dp[j+ans[i].h],dp[j]);///当前高度加上垃圾高度,取原来高度所用时间与事成之后所用时间的最大值
                dp[j]+=ans[i].f;///当前高度不增加,那么我们就加上此时的时间
            }
        }
    }
    if(flag){
        printf("%d\n",dp[0]);

    }
    return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值