90 分,WA on #8 求助(悬1关)
查看原帖
90 分,WA on #8 求助(悬1关)
807826
zjpwdyf楼主2023/12/16 17:51

调了两个小时了,求大佬指点!

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 2005;
int T, mxP, W;
int ap, bp, as, bs;
int ans, dp[N][N];
int L, R, Q[N];
int main(){
	cin >> T >> mxP >> W;
	memset(dp, 0x8f, sizeof(dp));
	dp[0][0] = 0;
	for(int i = 1; i <= T; i ++){
		cin >> ap >> bp >> as >> bs;
		int lst = i - W - 1;
		for(int j = 0; j <= as; j ++) dp[i][j] = -ap * j;//买入 
		for(int j = 0; j <= mxP; j ++) dp[i][j] = max(dp[i][j], dp[i - 1][j]);//继承 
		if(i <= W) continue;//不然接下来会越界 
		L = 1, R = 0;
		for(int j = 0; j <= mxP; j ++){//买入 
			if(L <= R && Q[L] + as < j) L ++;
			while(L <= R && dp[lst][Q[L]] - ap * (j - Q[L]) <= dp[lst][j]) R --;
			Q[++ R] = j;
			dp[i][j] = max(dp[i][j], dp[lst][Q[L]] - ap * (j - Q[L]));
		}
		L = 1, R = 0;
		for(int j = mxP; ~j; j --){//卖出 
			if(L <= R && Q[L] - bs > j) L ++;
			while(L <= R && dp[lst][Q[L]] + bp * (Q[L] - j) <= dp[lst][j]) R --;
			Q[++ R] = j;
			dp[i][j] = max(dp[i][j], dp[lst][Q[L]] + bp * (Q[L] - j));
		}
	}
	for(int i = 0; i <= mxP; i ++) ans = max(ans, dp[T][i]);
	cout << ans;
	return 0;
}
2023/12/16 17:51
加载中...