绿题感觉状态设计的还是比较显然的,在注释里面
有没有也曾经是27pts的大佬啊?
#include<bits/stdc++.h>
using namespace std;
const int N=1010,M=7010;
int D,n;
struct trash{
int t,h,f;
}a[N];
bool cmp(trash x,trash y){
return x.t<y.t;
}
int f[N][M];
//前 i 个垃圾,能维持生命 j 小时的最高堆垃圾高度
signed main(){
scanf("%d%d",&D,&n);int sum=0;
for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i].t,&a[i].f,&a[i].h),sum+=a[i].h;
sort(a+1,a+n+1,cmp);
memset(f,-0x3f,sizeof(f));
f[0][10]=0;
for(int i=1;i<=n;i++)
for(int j=0;j<=M-10;j++){
if(j>=a[i].f&&j-a[i].f>=a[i].t) f[i][j]=max(f[i][j],f[i-1][j-a[i].f]);
//这个是选择用垃圾来延续生命
if(j>=a[i].t)f[i][j]=max(f[i][j],f[i-1][j]+a[i].h);//这个是增加高度
if(f[i][j]>=D){
printf("%d",a[i].t);
return 0;
}
}
printf("%d",sum);
return 0;
}
悬赏小号关注,拜谢大佬orz