题目链接:Link
Problem
Solution
考虑到时间节点只能是放置垃圾的时间点,所以状态只要记录第i个垃圾和高度j即可,如果状态表示最大能量会比较麻烦,直接表示最大生存时间即可。
注意坑点:输入的垃圾不一定按时间顺序。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int d,n,f[105];
struct Data { int t,f,h; };
Data a[105];
inline bool cmp(const Data &a,const Data &b) { return a.t<b.t; }
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
f[0]=10;
scanf("%d%d",&d,&n);
for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].t,&a[i].f,&a[i].h);
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) for(int j=d;j>=0;j--) if(f[j]>=a[i].t)
{
if(j+a[i].h>=d) { printf("%d
",a[i].t); return 0; }
f[j+a[i].h]=max(f[j+a[i].h],f[j]);
f[j]+=a[i].f;
}
printf("%d
",f[0]);
return 0;
}