求助
查看原帖
求助
895312
Archy_楼主2025/1/25 08:56

60pts,其余全wa,比答案输出的大。

#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#define fi first
#define se second
#define int long long
using namespace std;

int dp[10010][1010][2], n, newn, q, lg[1010];
vector <int> v, w;
map <int, pair<int, int> > mp;

signed main() {
	cin.tie(0) -> ios :: sync_with_stdio(0);
	v.emplace_back(0), w.emplace_back(0);
	lg[0] = -1;
	for(int i = 1; i <= 100; i ++) 
		lg[i] = lg[i >> 1] + 1;
	cin >> n; 
	for(int i = 1; i <= n; i ++) {
		int a, b, c; cin >> a >> b >> c;
		int st = newn + 1;
		for(int j = 0; j <= lg[c]; j ++) {
			if(c - (j + 1) >= 0) {
				c -= (j + 1);
				v.emplace_back(a * (1 << j));
				w.emplace_back(b * (1 << j));
				++ newn;
			}
		}
		if(c != 0) {
			v.emplace_back(a * c);
			w.emplace_back(b * c);
			++ newn;
		}
		int en = newn;
		mp[i] = {st, en};
	}
//	for(int i = 1; i <= newn; i ++) cout << v[i] << " "; cout << "\n";
//	for(int i = 1; i <= newn; i ++) cout << w[i] << " "; cout << "\n";
	for(int i = 1; i <= newn; i ++) {
		for(int j = 0; j <= 1000; j ++) {
			if(j >= v[i]) dp[i][j][0] = max(dp[i - 1][j][0], dp[i - 1][j - v[i]][0] + w[i]);
			else dp[i][j][0] = dp[i - 1][j][0];
		}
	}
	for(int i = newn; i >= 1; i --) {
		for(int j = 0; j <= 1000; j ++) {
			if(j >= v[i]) dp[i][j][1] = max(dp[i + 1][j][1], dp[i + 1][j - v[i]][1] + w[i]);
			else dp[i][j][1] = dp[i + 1][j][1];
		}
	}
	cin >> q;
	while(q --) {
		int d, e; cin >> d >> e; d ++;
		int st = mp[d].fi, en = mp[d].se;
		int ans = 0;
		for(int i = 0; i <= e; i ++) {
			ans = max(ans, dp[st - 1][i][0] + dp[en + 1][e - i][1]);
		} 
		cout << ans << "\n";
	}
	return 0;
}
2025/1/25 08:56
加载中...