题解 P1156 【垃圾陷阱】

题目链接: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\n",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\n",f[0]);
	return 0;
}
posted @ 2019-10-29 21:21  happyZYM  阅读(167)  评论(0编辑  收藏  举报