QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#114834 | #6194. Knapsack Problem | std_abs# | WA | 183ms | 3524kb | C++20 | 4.4kb | 2023-06-23 17:55:00 | 2023-06-23 17:55:01 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
#define sz(a) ((int)a.size())
const int mod = 998244353, N = 100005;
struct Simplex {
using T = long double;
static const int N = 16, M = 8;
const T eps = 1e-7;
int n, m;
int Left[M], Down[N];
T a[M][N], b[M], c[N], v, sol[N];
bool eq(T a, T b) {return fabs(a - b) < eps;}
bool ls(T a, T b) {return a < b && !eq(a, b);}
void init(int _n, int _m) {
n = _n, m = _m, v = 0;
for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) {
a[i][j] = 0;
}
for (int i = 0; i < m; ++i) {
b[i] = 0;
}
for (int i = 0; i < n; ++i) {
c[i] = sol[i] = 0;
}
}
void pivot(int x, int y) {
swap(Left[x], Down[y]);
T k = a[x][y]; a[x][y] = 1;
vector <int> nz;
for (int i = 0; i < n; ++i) {
a[x][i] /= k;
if (!eq(a[x][i], 0)) {
nz.pb(i);
}
}
b[x] /= k;
for (int i = 0; i < m; ++i) {
if (i == x || eq(a[i][y], 0)) {
continue;
}
k = a[i][y], a[i][y] = 0;
b[i] -= k * b[x];
for (int j : nz) {
a[i][j] -= k * a[x][j];
}
}
if (eq(c[y], 0)) {
return;
}
k = c[y], c[y] = 0, v += k * b[x];
for (int i : nz) {
c[i] -= k * a[x][i];
}
}
int solve() {
for (int i = 0; i < n; ++i) {
Down[i] = i;
}
for (int i = 0; i < m; ++i) {
Left[i] = n + i;
}
while (1) {
int x = -1, y = -1;
for (int i = 0; i < m; ++i) if (ls(b[i], 0) && (x == -1 || b[i] < b[x])) {
x = i;
}
if (x == -1) {
break;
}
for (int i = 0; i < n; ++i) if (ls(a[x][i], 0) && (y == -1 || a[x][i] < a[x][y])) {
y = i;
}
if (y == -1) return 1;
pivot(x, y);
}
while (1) {
int x = -1, y = -1;
for (int i = 0; i < n; ++i) if (ls(0, c[i]) && (y == -1 || c[i] > c[y])) {
y = i;
}
if (y == -1) {
break;
}
for (int i = 0; i < m; ++i) if (ls(0, a[i][y]) && (x == -1 || b[i] / a[i][y] < b[x] / a[x][y])) {
x = i;
}
if (x == -1) {
return 2;
}
pivot(x, y);
}
for (int i = 0; i < m; ++i) {
if (Left[i] < n) {
sol[Left[i]] = b[i];
}
}
return 0;
}
} solver;
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int t;
cin >> t;
while (t--) {
int k;
cin >> k;
int n = (1 << k) - 1;
solver.init(n, k * 2);
vector <int> c(n);
for (int i = 0; i < n; ++i) {
cin >> c[i];
solver.c[i] = c[i];
}
vector <int> a(k);
for (int i = 0; i < k; ++i) {
cin >> a[i];
for (int j = 0; j < n; ++j) {
solver.a[i * 2][j] = ((j + 1) >> i & 1 ? 1 : 0);
solver.a[i * 2 + 1][j] = ((j + 1) >> i & 1 ? -1 : 0);
solver.b[i * 2] = a[i];
solver.b[i * 2 + 1] = a[i];
}
}
int x = solver.solve();
assert(x == 0);
vector <ll> res(n);
for (int i = 0; i < n; ++i) {
res[i] = solver.sol[i];
}
ll best = 0;
for (int msk = 0; msk < 1 << n; ++msk) {
ll ans = 0;
vector <ll> sum(k);
for (int i = 0; i < n; ++i) for (int j = 0; j < k; ++j) if ((i + 1) >> j & 1) {
sum[j] += res[i] + (msk >> i & 1);
}
for (int i = 0; i < n; ++i) {
ans += (res[i] + (msk >> i & 1)) * c[i];
}
bool ok = true;
for (int i = 0; i < k; ++i) {
ok &= sum[i] == a[i];
}
if (ok) {
best = max(best, ans);
}
}
cout << best << '\n';
}
}
詳細信息
Test #1:
score: 100
Accepted
time: 3ms
memory: 3396kb
input:
3 2 1 2 4 4 5 3 3226252 19270256 2430652 1187613 12496062 10286165 17494834 24 85 34 4 901133 6693218 13245489 14740234 16186210 11382783 19277321 3855635 16523184 10168517 16195031 971041 10303441 8395899 11618555 529321239 218214127 92942310 207467810
output:
18 1949753378 7832404777567179
result:
ok 3 number(s): "18 1949753378 7832404777567179"
Test #2:
score: 0
Accepted
time: 183ms
memory: 3524kb
input:
100 4 4488409 9842893 14331290 11289097 15777479 21131954 25620334 6146092 10634508 15988956 20477387 17435190 21923584 27278027 31766493 200477197 258791439 590664017 982949628 4 5484152 19851747 25335961 6555937 12039831 26407861 31891996 10897184 16381166 30749333 36233145 17453055 22937114 37304...
output:
16156444320083421 24565535429631234 29418802996321901 30685727712782520 21026118053726857 27272339796311010 28831028447377015 34577176834491128 9058894962996375 21525085254465501 6657186892229297 16750628911275484 11217846865301187 12674726744043780 33873234230125448 3890237279573366 319038768614465...
result:
ok 100 numbers
Test #3:
score: 0
Accepted
time: 181ms
memory: 3452kb
input:
100 4 11618334 18295966 29914477 5116382 16734869 23412289 35030567 15002473 26620994 33298395 44916782 20118655 31737127 38414456 50032872 52573649 733715025 105771527 204824011 4 2142433 13679527 15822005 7304783 9447231 20984363 23126840 6271380 8413827 19950941 22093291 13576168 15718643 2725577...
output:
17648887427676796 21625331519839488 5123483163674640 20332898488476516 10882410276737710 25799406290369942 9021794681785918 14079661025657823 19651479225495798 19108340996997031 7502197529195960 14859286025000990 26534486448012504 21196964793845212 17222108748663918 19112873745810973 150116234459639...
result:
ok 100 numbers
Test #4:
score: -100
Wrong Answer
time: 182ms
memory: 3520kb
input:
100 4 19912840 5584811 25497404 10173442 30086113 15758284 35670730 10055784 29968204 15640365 35553036 20228929 40141706 25813818 45726645 199637398 648830099 620879036 721665690 4 7571016 7507237 15078004 19283701 26854580 26790914 34361725 2809630 10380467 10316661 17887650 22093187 29664080 2960...
output:
21172351446279597 12216316207781859 31685774482329793 36066732654517313 19340822375673782 17094361082328640 19075803268324489 23946411427126244 15750520513128720 10839993372177143 28038252774564427 12098359408203383 16661717061725678 16141878677697603 10422881545500853 23195259150880456 161145733965...
result:
wrong answer 98th numbers differ - expected: '24656983842107825', found: '24656983842107818'