全部超时和RA
查看原帖
全部超时和RA
370532
SuAnRan楼主2022/12/4 15:30
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4 + 10;
int n, m, C;
int v[N], w[N], d[N];
int a[7], b[7], c[7];
LL f[10001];

int go(int a, int b, int c, int x) {
	return a * x * x + b * x + c;
}

inline int read() {
	int f = 1, x = 0;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-')
			f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return f * x;
}

int main() {
	scanf("%d %d %d", &n, &m, &C);
	int num = 1;
	int tiji[N + 1000], jia[N + 1000];
	for (int i = 1; i <= n; i++) {
		v[i] = read(), w[i] = read(), d[i] = read();
		for (int k = 1; k <= d[i] && k * d[i] <= C; k *= 2) {
			tiji[num] = v[i] * k;
			jia[num] = w[i] * k;
			d[i] -= k;
			num++;
		}
		if (d[i] >= 0)
			tiji[num] = d[i] * v[i], jia[num] = d[i] * w[i];
	}
	//完美2进制优化
	int r[100];
	int q = 1;
	int t = C;
	for (int k = 1; k <= t; k *= 2) {
		r[q] = k;
		t -= k;
		q++;
	}
	if (t >= 0)
		r[q] = t;
		
	for (int i = 1; i <= m; i++) {
		a[i] = read(), b[i] = read(), c[i] = read();
		for (int j = 1; j <= q; j++) {
			num++;
			tiji[num] = r[j];
			jia[num] = go(a[i], b[i], c[i], r[j]);
		}
	}
	//奇货2进制优化
	for (int i = 1; i <= num; i++)
		for (int j = C; j >= 0; j--)
			f[j] = max(f[j], f[j - tiji[i]] + jia[i]);
	cout << f[C];
}

全部超时和RA,不知道为啥,全部运用2进制优化,然后用01背包一个一个做,不知道错哪了

2022/12/4 15:30
加载中...