From 1b9d59bd8eb71ecd85a1c82117cd9aed9b3eb416 Mon Sep 17 00:00:00 2001 From: oncsr Date: Fri, 21 Feb 2025 11:21:08 +0900 Subject: [PATCH] =?UTF-8?q?[20250221]=20BOJ=20/=20P3=20/=20=EC=8A=A4?= =?UTF-8?q?=ED=8B=B0=EC=BB=A4=20=EC=88=98=EC=A7=91=20/=20=EA=B6=8C?= =?UTF-8?q?=ED=98=81=EC=A4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\354\273\244 \354\210\230\354\247\221.md" | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 "khj20006/202502/21 BOJ P3 \354\212\244\355\213\260\354\273\244 \354\210\230\354\247\221.md" diff --git "a/khj20006/202502/21 BOJ P3 \354\212\244\355\213\260\354\273\244 \354\210\230\354\247\221.md" "b/khj20006/202502/21 BOJ P3 \354\212\244\355\213\260\354\273\244 \354\210\230\354\247\221.md" new file mode 100644 index 00000000..b3c46340 --- /dev/null +++ "b/khj20006/202502/21 BOJ P3 \354\212\244\355\213\260\354\273\244 \354\210\230\354\247\221.md" @@ -0,0 +1,74 @@ +```cpp + +#include +#include +#include +#include +using namespace std; + +int N, K, M; +int price[32]{}, value[32]{}, ex[32]{}; +vector> A; +vector X; + +int main() +{ + cin.tie(0)->sync_with_stdio(0); + + cin >> N; + for (int i = 0; i < N; i++) cin >> price[i]; + for (int i = 0; i < N; i++) cin >> value[i]; + for (cin >> K >> M; M--;) { + int a; + cin >> a; + ex[a]++; + } + + if (N > 16) { + for (int i = 0; i < (1 << (N - 16)); i++) { + int p = 0, v = 0; + for (int k = 0; k < N - 16; k++) { + if (i & (1 << k)) { + v += value[k + 16]; + if (!ex[k + 16]) p += price[k + 16]; + } + else if (ex[k + 16]) p -= price[k + 16]; + } + A.emplace_back(v, p); + } + sort(A.begin(), A.end()); + X.resize(A.size()); + + int mn = A.back().second; + for (int i = A.size() - 1; i >= 0; i--) { + mn = min(mn, A[i].second); + X[i] = mn; + } + } + + + + int ans = -2e9; + for (int i = 0; i < (1 << min(N, 16)); i++) { + int p = 0, v = 0; + for (int k = 0; k < min(N, 16); k++) { + if (i & (1 << k)) { + v += value[k]; + if (!ex[k]) p += price[k]; + } + else if (ex[k]) p -= price[k]; + } + if (N <= 16) { + if (v >= K) ans = ans == -2e9 ? p : min(p, ans); + } + else { + int j = lower_bound(A.begin(), A.end(), make_pair(K - v, 0)) - A.begin(); + if (j == A.size()) continue; + ans = ans == -2e9 ? p + X[j] : min(ans, p + X[j]); + } + } + cout << (ans == -2e9 ? -1 : max(0, ans)); + +} + +```