垃圾陷阱 luogu-1156
题目大意:Holsteins在距离地面D英尺的地方,FJ间隔时间ti会往下扔第i个垃圾。Holsteins对待每一个垃圾都会选择吃掉或者垫高。Holsteins有10个点儿的生命值,每个垃圾会给她提供f的生命值。每小时Holsteins会消耗一定的生命值。问:Holsteins最早可以什么时候爬出;否则输出Holsteins可以存活多长时间。
注释:$2\le D\le 100$,$0 < t \le 1000$,$1\le h \le 25$,$1\le f \le 30$。
想法:背包dp,和普通的背包不同的是如果这个物品不选,那么它会对Holsteins的生命值产生影响,稍微判断即可。
最后,附上丑陋的代码... ...
// luogu-judger-enable-o2
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 110
using namespace std;
struct Node
{
int t,h,l;
}f[N];
int n,m;
int ti[N];
int dp[N];
inline bool cmp(Node a,Node b)
{
return a.t<b.t;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&f[i].t,&f[i].l,&f[i].h);
}
sort(f+1,f+m+1,cmp);
dp[0]=10;
for(int i=1;i<=m;i++)
{
for(int j=n;j>=0;j--)
{
if(dp[j]>=f[i].t)
{
if(j+f[i].h>=n)
{
cout<<f[i].t;
return 0;
}
dp[j+f[i].h]=max(dp[j+f[i].h],dp[j]);
dp[j]+=f[i].l;
}
}
}
printf("%d\n",dp[0]);
return 0;
}
小结:无。