果然喜欢把简单的题想复杂呵呵
01背包
f[I][j]表示使用完第I个垃圾,高度为j时的最大剩余生命值,因为同一高度生命值越多越优
转移显然
但是此题坑很多。。特别要注意在每个垃圾下落之前,判断所剩生命值减去此垃圾与上一个垃圾的间隔是否大于等于0.
#include<iostream>
#include<cstring>
#include<algorithm>
#define dp f
#define maxn 100+5
#define maxh 25+5
#define inf 0x7ffff
using namespace std;
struct waste{
int t,h,e;
friend bool operator < (waste a,waste b){
return a.t<b.t;
}
}a[maxn];
inline int cost (int i){
return (a[i].t-a[i-1].t);
}
int f[maxn][maxn*maxh];
int main(){
ios::sync_with_stdio(false);
int d,g;cin>>d>>g;
for(int i=1;i<=g;i++){
cin>>a[i].t>>a[i].e>>a[i].h;
}
sort(a+1,a+g+1);
for(int i=0;i<maxn;i++)
for(int j=0;j<maxn*maxh;j++)
f[i][j]=-inf;
f[0][0]=10;
for(int i=1;i<=d;i++)
f[i][0]=f[i-1][0]+a[i].e-cost(i);
//f[i][j]表示第i个,高度为j时的最大能量
for(int i=1;i<=g;i++){
for(int j=d+a[i].h;j>=0;j--){
int hh=a[i].h,ee=a[i].e,cc=cost(i);
if(j-hh>=0){
f[i][j]=max(f[i][j],f[i-1][j-hh]-cc);
}
if(f[i-1][j]-cc>=0){
f[i][j]=max(f[i][j],f[i-1][j]-cc+ee);
}
if(j>=d&&f[i][j]>=0){
cout<<a[i].t;
return 0;
}
}
}
int i=1;
while(f[i][0]>0)i++;
cout<<f[i-1][0]+a[i-1].t;
return 0;
}
214

被折叠的 条评论
为什么被折叠?



