WA 求调
查看原帖
WA 求调
579692
LSC666楼主2025/7/1 17:52

喜欢 define 见谅

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

#define ofor(i, a, b) for (int i = a; i < b; i++)
#define cfor(i, a, b) for (int i = a; i <= b; i++)
#define bfor(i, a, b) for (int i = a; i >= b; i--)
#define mset(a, x) memset(a, x, sizeof(a))
#define lowbit(x) ((x) & (-(x)))

int n, m, p[205], d[205], a[205];

struct state {
	bool valid; // 是否可行
	int last; // 上一个选的是什么
	int sum; // P + D
} f[205][25][805]; // f[i][j][x]: 前 i 个,选 j 个,P - D = x - 400

stack<int> st;

int main() {
	// ios::sync_with_stdio(0);
	int T = 0;
	while (cin >> n >> m) {
		if (n == 0 and m == 0) break;
		T++;

		mset(p, 0);
		mset(d, 0);
		mset(a, 0);
		mset(f, 0);

		cfor (i, 1, n) {
			cin >> p[i] >> d[i];
			a[i] = p[i] - d[i];
		}
	
		f[0][0][400] = {true, 0, 0};
		
		cfor (i, 1, n) {
			cfor (j, 0, m) {
				cfor (x, 0, 800) {
						state v1 = f[i - 1][j][x]; // 不选
						f[i][j][x] = {v1.valid, v1.last, v1.sum};
						state v2 = f[i - 1][j - 1][x - a[i]]; // 选
						if (j >= 1 and x >= a[i] and v2.valid and v2.sum + p[i] + d[i] >= f[i][j][x].sum) 
							f[i][j][x] = {true, i, v2.sum + p[i] + d[i]};
				}
			}
		}
	
		int ans = 1e9, pos = -1, maxsum = -1;
		cfor (x, 0, 800) {
			if (not f[n][m][x].valid) continue;
			if (abs(x - 400) < ans or (abs(x - 400) == ans and f[n][m][x].sum >= maxsum))
				ans = abs(x - 400), pos = x, maxsum = f[n][m][x].sum;
		}
		
		int P = 0, D = 0;
		for (int i = n, j = m, x = pos; f[i][j][x].last != 0; x -= a[i], i--, j--) {
			i = f[i][j][x].last;
			st.push(i);
			P += p[i], D += d[i];
		}

		printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n", T, P, D);
		while (not st.empty()) {
			cout << " " << st.top();
			st.pop();
		}
		cout << endl << endl;
	}
	return 0;
}
2025/7/1 17:52
加载中...