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; }