题解 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;
}
本作品由happyZYM采用知识共享 署名-非商业性使用-相同方式共享 4.0 (CC BY-NC-SA 4.0) 国际许可协议(镜像(简单版)镜像(完整版))进行许可。
转载请注明出处:https://www.cnblogs.com/happyZYM/p/11761654.html (近乎)全文转载而非引用的请在文首添加出处链接。