P1156 垃圾陷阱

106 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

题目:卡门――农夫约翰极其珍视的一条 Holsteins 奶牛――已经落了到 “垃圾井” 中。“垃圾井” 是农夫们扔垃圾的地方,它的深度为 D(2≤D≤100)英尺。 卡门想把垃圾堆起来,等到堆得高度大等于于井的深度时,她就能逃出井外了。另外,卡门可以通过吃一些垃圾来维持自己的生命。 每个垃圾都可以用来吃或堆放,并且堆放垃圾不用花费卡门的时间。 假设卡门预先知道了每个垃圾扔下的时间 t(1≤t≤1000),以及每个垃圾堆放的高度 ℎ(1≤ℎ≤25)和吃进该垃圾能维持生命的时间 f(1≤f≤30),要求出卡门最早能逃出井外的时间,假设卡门当前体内有足够持续 10 小时的能量,如果卡门 10 小时内(不含 10 小时,维持生命的时间同)没有进食,卡门就将饿死。
思路:dp[j]表示到达了深度j时所能坚持的最大时间,那么如果当前的t满足的话直接输出t就行,如果不满足就看看是否可以坚持到该垃圾掉落然后分别写出吃掉和用掉的情况,最后如果实在出不去就把垃圾全吃了

#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define ll long long
#define int long long
#define lowbit(x) ((x)&(-x))
#define endl '\n'
using namespace std;
const ll mod=998244353;
const ll inf=1e9;
const double pi=acos(-1);
const int N=1e6+100;
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int d,g,dp[135];
struct node{
    int t,f,h;
    bool operator<(const node &o)const{
        return t<o.t;
    }
}a[105];
signed main()
{
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>d>>g;
    for(int i=1;i<=g;i++) cin>>a[i].t>>a[i].f>>a[i].h;
    sort(a+1,a+g+1);
    dp[0]=10;
    for(int i=1;i<=g;i++){
        for(int j=d;j>=0;j--){
            if(dp[j]>=a[i].t){
                if(j+a[i].h>=d){
                    cout<<a[i].t<<endl;
                    return 0;
                }
                dp[j+a[i].h]=max(dp[j+a[i].h],dp[j]);
                dp[j]+=a[i].f;
            }
            
        }
    }
    cout<<dp[0]<<endl;
    return 0;
}