绿题求调(悬棺/kk
  • 板块P1156 垃圾陷阱
  • 楼主Kniqht
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/11/12 17:57
  • 上次更新2023/11/12 20:15:55
查看原帖
绿题求调(悬棺/kk
315205
Kniqht楼主2023/11/12 17:57

绿题感觉状态设计的还是比较显然的,在注释里面

有没有也曾经是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

2023/11/12 17:57
加载中...