73分,f[i][j]表示第i个垃圾时还可以存活时间j时的最大高度。
# include <iostream>
# include <cstdio>
# include <algorithm>
using namespace std;
int H,n,ans;
int f[1010][11000];
struct node{
int t,w,h;
}rub[110];
bool cmp(node a,node b){
return a.t<b.t;
}
int main(){
scanf("%d%d",&H,&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&rub[i].t,&rub[i].w,&rub[i].h);
sort(rub+1,rub+n+1,cmp);
for(int i=0;i<=n;i++)
for(int j=0;j<=1000;j++)
f[i][j]=-1476146187;
for(int i=0;i<=10;i++)
f[0][i]=0;
bool flag=0;
for(int i=1;i<=n;i++)
for(int j=100;j>=0;j--){
int dis=rub[i].t-rub[i-1].t;
f[i][j]=max(f[i][j],f[i-1][j+dis]+rub[i].h);
if(j-rub[i].w+dis>=0)
f[i][j]=max(f[i][j],f[i-1][j-rub[i].w+dis]);
if(f[i][j]>=H) {
//printf("%d %d %d\n",i,j,f[i][j]);
ans=rub[i].t;
flag=1;
break;
}
if(flag)
break;
}
if(ans!=0) printf("%d",ans);
else{
ans=10;
for(int i=1;i<=n;i++){
if(ans<rub[i].t) break;
ans+=rub[i].w;
}
printf("%d",ans);
}
return 0;
}