思路同注释 #2的问题:AC答案是187 我程序输出177,但下一个满足能跑出去的高度即为187
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define MAXG 105
#define MAXHP 3050
using namespace std;
int d,g;
struct node{
int t,f,h;
}rub[MAXG];
bool cmp(node a,node b){
return a.t<b.t;
}
int chp[MAXG];
int f[MAXHP];//滚动数组 表示到第i个垃圾时且体力为j时的能达到的最大高度
int ans2=10;//用于表示最大存活时间
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
scanf("%d%d",&d,&g);
for(int i=1;i<=g;i++)scanf("%d%d%d",&rub[i].t,&rub[i].f,&rub[i].h);
sort(rub+1,rub+1+g,cmp);
memset(f,0xaf,sizeof(f));//初始化为极小值
f[10]=0;//边界
chp[0]=10;
for(int i=1;i<=g;i++)chp[i]+=chp[i-1]+rub[i].f;//第i个垃圾时体力的上界
for(int i=1;i<=g;i++){
for(int j=chp[i];j>=rub[i].t;j--){//j表示当前的体力 j要大于等于第i个垃圾投入的时间
if(j>=rub[i].f){
f[j]=max(f[j]+rub[i].h,f[j-rub[i].f]);//垫or吃
}else f[j]=f[j]+rub[i].h;//只能垫
if(f[j]>=d){//最大高度大于坑的深度
printf("%d\n",rub[i].t);
return 0;
}
}
}//活不成了
for(int i=1;i<=g;i++){
if(ans2>=rub[i].t)ans2+=rub[i].f;
else break;
}
printf("%d",ans2);
return 0;
}