70分,背包求调!
查看原帖
70分,背包求调!
1152177
Kuromi0212楼主2024/5/27 17:11
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 10, maxm = 2000 + 10;
int n, m, k, x[maxn], y[maxn], l[maxn], h[maxn];
long long f[maxn][maxm], ans;
bool e[maxn];
int main() {
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		cin >> x[i] >> y[i];
	}
	for (int i = 1; i <= n; i++) {
		l[i] = 1;
		h[i] = m;
	}
	int p1, l1, h1;
	for (int i = 1; i <= k; i++) {
		cin >> p1 >> l1 >> h1;
		e[p1] = 1;
		l[p1] = l1 + 1;
		h[p1] = h1 - 1;
	}
	memset(f, 0x7f, sizeof(f));
	for (int i = 1; i <= m; i++) {
		f[0][i] = 0;
	}
	for (int i = 1; i <= n; i++) {
		for (int j = x[i] + 1; j <= m + x[i]; j++) {
			f[i][j] = min(f[i - 1][j - x[i]] + 1, f[i][j - x[i]] + 1);
		}
		for (int j = m + 1; j <= m + x[i]; j++) {
			f[i][m] = min(f[i][m], f[i][j]);
		}
		for (int j = 1; j <= m - y[i]; j++) {
			f[i][j] = min(f[i][j], f[i - 1][j + y[i]]);
		}
		for (int j = 1; j < l[i]; j++) {
			f[i][j] = f[0][0];
		}
		for (int j = h[i] + 1; j <= m; j++) {
			f[i][j] = f[0][0];
		}
	}
	ans = f[0][0];
	for (int i = 1; i <= m; i++) {
		ans = min(ans, f[n][i]);
	}
	if (ans < f[0][0]) {
		cout << 1 << endl;
		cout << ans;
	} else {
		int c1, c2;
		for (int i = n; i >= 1; i--) {
			for (int j = 1; j <= m; j++) {
				if (f[i][j] < f[0][0]) {
					c2 = j;
					break;
				}
			}
			if (c2 <= m) {
				c1 = i;
				break;
			}
		}
		ans = 0;
		for (int j = 1; j <= c1; ++j) {
			if (e[j]) ans++;
		}
		cout << 0 << endl;
		cout << ans;
	}
	return 0;
}
2024/5/27 17:11
加载中...