LuogP1156 垃圾陷阱

题面

背包,排序后显然和时间没有关系

记f[i]为深度为i的点的最大耐饿时间,很容易推出式子

 

Warning:边界问题,每次转移要保证奶牛还活着(即f[i]>=t)

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
struct A{ int t,a,b; }a[N];
bool cmp(A i,A j) {
    return i.t<j.t;
}
int n,m,f[N];

int main() {
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n;i++) {
        scanf("%d%d%d",&a[i].t,&a[i].a,&a[i].b);
    }
    sort(a+1,a+n+1,cmp);
    f[0]=10;
    for(int i=1;i<=n;i++) {
        for(int j=m-1;j>=0;j--) {
            if(f[j]>=a[i].t&&j+a[i].b>=m) {
                printf("%d\n",a[i].t);
                return 0;
            }
            if(f[j]>=a[i].t) f[j]=f[j]+a[i].a;
            if(j>=a[i].b&&f[j-a[i].b]>=a[i].t) f[j]=max(f[j],f[j-a[i].b]);
        }
    }
    printf("%d\n",f[0]);
    return 0;
} 
posted @ 2020-09-04 20:39  wwwsfff  阅读(177)  评论(0)    收藏  举报