救救孩子吧
查看原帖
救救孩子吧
102028
初嫁QAQ楼主2020/9/20 21:25

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;
}
2020/9/20 21:25
加载中...