73pts求调 wa#2 #5 #10
查看原帖
73pts求调 wa#2 #5 #10
462050
Misakura_Rin楼主2022/9/25 00:09

思路同注释 #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;
}

2022/9/25 00:09
加载中...