82pts求调
查看原帖
82pts求调
1105993
Misserina楼主2024/9/17 16:18
#include <bits/stdc++.h>
using namespace std;
int d,g,t[105],f[105],h[105],cntf[105],cnth[105],seqt[105],mxtime=10;
int dp[105][205];
bool marked[105][205];
bool compt(int a,int b) {
	return t[a]<t[b];
}
int main() {
	//freopen("well1.in","r",stdin);
	scanf("%d%d",&d,&g);
	for (int i=1;i<=g;i++) {
		scanf("%d%d%d",&t[i],&f[i],&h[i]);
		seqt[i]=i;
	}
	sort(seqt+1,seqt+g+1,compt);
	for (int i=0;i<=g;i++) {
		mxtime+=f[seqt[i]];
		if (mxtime<t[seqt[i+1]]) break;
	}
	cntf[0]=10;
	for (int i=1;i<=g;i++) {
		cntf[i]=cntf[i-1]+f[seqt[i]];
	}
	//printf("%d",mxtime);
	bool can=0;
	dp[0][0]=10;
	marked[0][0]=1;
	for (int i=1;i<=g;i++) {
		int pos=seqt[i];
		for (int j=d;j>=0;j--) {
			if (marked[i-1][j]) {
				if (dp[i-1][j]+f[pos]+t[seqt[i-1]]-t[pos]>=0) {
					dp[i][j]=max(dp[i][j],dp[i-1][j]+f[pos]+t[seqt[i-1]]-t[pos]);
					marked[i][j]=1;
				}
				if (dp[i-1][j]+t[seqt[i-1]]-t[pos]>=0){
					if (j+h[pos]>=d) {
						printf("%d",t[pos]);
						can=1;
						break;
					}
					else {
						dp[i][j+h[pos]]=dp[i-1][j]+t[seqt[i-1]]-t[pos];
						marked[i][j+h[pos]]=1;
					}
				}
			}
			//printf("%d %d %d\n",i,j,dp[i][j]);
		}
		if (can) break;
		//printf("%d ",pos);
	}
	if (!can) printf("%d",mxtime);
}

输入数据:

42 25
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 26 5
10 26 5
10 26 5
10 26 6
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
10 25 1
510 1 21

应该输出 510510,该代码输出 615615

2024/9/17 16:18
加载中...