洛谷【P1156】垃圾陷阱

也是一眼能看出来的01背包,但是状态不太好选择,可以选择时间也可以选择高度,其实都差不多,时空要求比较低,我选择高度作为的状态,选择了状态和决策之后,状态转移方程就显而易见了,比较难处理的是对于不能达到时的情况,第一遍提交的时候有一个点没过,就是因为第二种情况没写好,不过其实画个图还蛮好写的。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
int sumt,uppon,dp[1010][110],n,d,m;
struct trash{
    int t,f,h;
}tr[110];
int cmp(const trash &a,const trash &b){return a.t<b.t;} 
int main()
{
    //freopen("std.in","r",stdin);
    sumt=10;uppon=0;
    cin>>d>>n;
    for (int i=1;i<=n;i++)
    cin>>tr[i].t>>tr[i].f>>tr[i].h;
    sort(tr+1,tr+n+1,cmp);
    memset(dp,-1,sizeof(dp));
    dp[0][0]=10;tr[0].t=0;tr[0].f=0;
    for (int i=1;i<=n;i++)
    {
        int c=tr[i].t-tr[i-1].t;
        uppon+=tr[i].h;
        for (int j=uppon;j>=0;j--)
        {
            if (dp[i-1][j]>=c)//注意这里的边界值,题目没有说明,但是样例里已经暗示了 
            dp[i][j]=max(dp[i][j],dp[i-1][j]+tr[i].f-c);
            if (j>=tr[i].h)dp[i][j]=max(dp[i][j],dp[i-1][j-tr[i].h]-c);
            if (j>=d&&dp[i][j]>=0){cout<<tr[i].t;return 0;}
        }       
    }
    int ans=10,k;
    for (int i=1;i<=n;i++)//判断如果到达不了的话
    {
        ans+=tr[i].f;k=sumt;
        sumt=sumt+tr[i-1].t-tr[i].t+tr[i-1].f;
        if (sumt<0){cout<<ans-tr[i].f;return 0;}
    }       
    cout<<ans;
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值