結果
問題 | No.2370 He ate many cakes |
ユーザー |
![]() |
提出日時 | 2023-07-04 01:51:04 |
言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,806 bytes |
コンパイル時間 | 1,607 ms |
コンパイル使用メモリ | 145,148 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-17 23:39:01 |
合計ジャッジ時間 | 2,559 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 14 WA * 2 |
ソースコード
#include <cassert> #include <cmath> #include <algorithm> #include <iostream> #include <iomanip> #include <climits> #include <map> #include <queue> #include <set> #include <cstring> #include <vector> using namespace std; typedef long long ll; vector<ll> A; vector<ll> build_values(int from, int to) { vector<ll> values; values.push_back(0); for (int i = from; i <= to; ++i) { vector<ll> temp = values; for (ll v : values) { ll nv = v + A[i]; temp.push_back(nv); } values = temp; } sort(values.begin(), values.end()); return values; } int main() { ll N, K; cin >> N >> K; A.resize(N); for (int i = 0; i < N; ++i) { cin >> A[i]; } if (N == 1) { if (K == 1) { cout << 0 << endl; } else { cout << A[0] << endl; } } else { int mid = N / 2; vector<ll> memo1 = build_values(0, mid - 1); vector<ll> memo2 = build_values(mid, N - 1); /* for (ll v1 : memo1) { cerr << v1 << " "; } cerr << endl; for (ll v2 : memo2) { cerr << v2 << " "; } cerr << endl; */ ll ok = LLONG_MAX - 1; ll ng = LLONG_MIN; while (abs(ok - ng) >= 2) { ll x = (ok + ng) / 2; ll cnt = 0; for (ll v1 : memo1) { if (v1 + memo2.back() < x) continue; ll ok2 = memo2.size() - 1; ll ng2 = -1; while (abs(ok2 - ng2) >= 2) { ll idx = (ok2 + ng2) / 2; ll nv = v1 + memo2[idx]; if (nv >= x) { ok2 = idx; } else { ng2 = idx; } } cnt += memo2.size() - ok2; } // fprintf(stderr, "x: %lld, cnt: %lld\n", x, cnt); if (cnt >= K) { ok = x; } else { ng = x; } } cout << ok << endl; } return 0; }