QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#568006 | #8936. Team Arrangement | duckindog | WA | 0ms | 3640kb | C++23 | 1.2kb | 2024-09-16 14:56:38 | 2024-09-16 14:56:39 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 60 + 10,
MIN = -1'000'000'000'000'000'000;
int n;
struct Student {
int l, r;
friend istream& operator >> (istream& is, auto& rhs) {
return is >> rhs.l >> rhs.r;
}
} s[N];
int w[N];
map<int, int> f;
map<int, int> value;
int32_t main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; ++i) cin >> s[i];
for (int i = 1; i <= n; ++i) cin >> w[i];
for (int mask = 1; mask < (1ll << n); ++mask) {
int l = 1, r = n;
for (int i = 1; i <= n; ++i) {
if (!(mask >> i - 1 & 1)) continue;
l = max(l, s[i].l);
r = min(r, s[i].r);
}
value[mask] = MIN;
int cnt = __builtin_popcount(mask);
for (int j = l; j <= r; ++j)
if (!(cnt % j)) value[mask] = max(value[mask], cnt / j * w[j]);
}
f[0] = 0;
for (int mask = 1; mask < (1ll << n); ++mask) {
auto& ret = f[mask]; ret = MIN;
for (int submask = mask; submask; submask = submask - 1 & mask)
ret = max(ret, f[mask ^ submask] + value[submask]);
}
if (f[(1ll << n) - 1] == MIN) cout << "impossible\n";
else cout << f[(1ll << n) - 1] << "\n";
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3640kb
input:
3 2 3 1 2 2 2 4 5 100
output:
9
result:
ok single line: '9'
Test #2:
score: 0
Accepted
time: 0ms
memory: 3532kb
input:
3 1 3 3 3 2 3 1 1 100
output:
100
result:
ok single line: '100'
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 3576kb
input:
2 1 1 2 2 1 1
output:
-999999999999999999
result:
wrong answer 1st lines differ - expected: 'impossible', found: '-999999999999999999'