Skip to content

Commit 719e89b

Browse files
authored
Merge pull request #164 from AlgorithmWithGod/khj20006
[20250221] BOJ / P3 / 스티커 수집 / 권혁준
2 parents d8e4733 + 1b9d59b commit 719e89b

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
```cpp
2+
3+
#include <iostream>
4+
#include <queue>
5+
#include <tuple>
6+
#include <algorithm>
7+
using namespace std;
8+
9+
int N, K, M;
10+
int price[32]{}, value[32]{}, ex[32]{};
11+
vector<pair<int, int>> A;
12+
vector<int> X;
13+
14+
int main()
15+
{
16+
cin.tie(0)->sync_with_stdio(0);
17+
18+
cin >> N;
19+
for (int i = 0; i < N; i++) cin >> price[i];
20+
for (int i = 0; i < N; i++) cin >> value[i];
21+
for (cin >> K >> M; M--;) {
22+
int a;
23+
cin >> a;
24+
ex[a]++;
25+
}
26+
27+
if (N > 16) {
28+
for (int i = 0; i < (1 << (N - 16)); i++) {
29+
int p = 0, v = 0;
30+
for (int k = 0; k < N - 16; k++) {
31+
if (i & (1 << k)) {
32+
v += value[k + 16];
33+
if (!ex[k + 16]) p += price[k + 16];
34+
}
35+
else if (ex[k + 16]) p -= price[k + 16];
36+
}
37+
A.emplace_back(v, p);
38+
}
39+
sort(A.begin(), A.end());
40+
X.resize(A.size());
41+
42+
int mn = A.back().second;
43+
for (int i = A.size() - 1; i >= 0; i--) {
44+
mn = min(mn, A[i].second);
45+
X[i] = mn;
46+
}
47+
}
48+
49+
50+
51+
int ans = -2e9;
52+
for (int i = 0; i < (1 << min(N, 16)); i++) {
53+
int p = 0, v = 0;
54+
for (int k = 0; k < min(N, 16); k++) {
55+
if (i & (1 << k)) {
56+
v += value[k];
57+
if (!ex[k]) p += price[k];
58+
}
59+
else if (ex[k]) p -= price[k];
60+
}
61+
if (N <= 16) {
62+
if (v >= K) ans = ans == -2e9 ? p : min(p, ans);
63+
}
64+
else {
65+
int j = lower_bound(A.begin(), A.end(), make_pair(K - v, 0)) - A.begin();
66+
if (j == A.size()) continue;
67+
ans = ans == -2e9 ? p + X[j] : min(ans, p + X[j]);
68+
}
69+
}
70+
cout << (ans == -2e9 ? -1 : max(0, ans));
71+
72+
}
73+
74+
```

0 commit comments

Comments
 (0)