求助,我感觉转移思路是对的啊
查看原帖
求助,我感觉转移思路是对的啊
357641
YyuanDa楼主2021/3/22 18:55
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int dp[2005];//dp[i][j]:前i个垃圾到j高度后最大体力值,不能到达为-1,滚动数组省去第一维 
int T[105],F[105],H[105],D,G,maxh=0,hhh,maxhunger=10;
struct node{
	int T,F,H;
}rub[105];
bool cmp(node A,node B){
	return A.T<B.T;
}
void init(){
	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);
	}
	hhh=2*D;
	for(int i=0;i<hhh;i++) dp[i]=-1;
	dp[0]=10;
	sort(rub+1,rub+1+G,cmp);
	rub[0].T=0;
}
int main(){
	init();
	for(int i=1;i<=G;i++){
		maxh+=rub[i].H;
		if(maxh>hhh) maxh=hhh;
		int t=rub[i].T-rub[i-1].T;//t>0
		for(int j=maxh;j>=0;j--){
			if(j>=rub[i].H&&dp[j-rub[i].H]>=t){//可放入 
				if(dp[j]<0) dp[j]=dp[j-rub[i].H]-t;
				else dp[j]=max(dp[j]+rub[i].F-t,dp[j-rub[i].H]-t);
			}
			else if(dp[j]>=t) dp[j]=dp[j]+rub[i].F-t;
			else if(dp[j]<t) dp[j]=-1;
			if(j>=D&&dp[j]>=0) {
				cout<<rub[i].T;
				return 0;
			}
		//	if(i==4) cout<<j<<" "<<dp[j]<<endl;
		}
		maxhunger=max(maxhunger,dp[0]);
	}
	cout<<maxhunger;
	return 0;
}
2021/3/22 18:55
加载中...