結果
問題 | No.2370 He ate many cakes |
ユーザー | siman |
提出日時 | 2023-07-04 01:51:47 |
言語 | C++17(clang) (17.0.6 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 27 ms / 2,000 ms |
コード長 | 1,806 bytes |
コンパイル時間 | 1,604 ms |
コンパイル使用メモリ | 143,624 KB |
実行使用メモリ | 6,948 KB |
最終ジャッジ日時 | 2024-07-17 23:40:01 |
合計ジャッジ時間 | 2,229 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
6,820 KB |
testcase_01 | AC | 2 ms
6,940 KB |
testcase_02 | AC | 2 ms
6,944 KB |
testcase_03 | AC | 12 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 1 ms
6,940 KB |
testcase_07 | AC | 1 ms
6,944 KB |
testcase_08 | AC | 1 ms
6,944 KB |
testcase_09 | AC | 1 ms
6,940 KB |
testcase_10 | AC | 8 ms
6,940 KB |
testcase_11 | AC | 12 ms
6,940 KB |
testcase_12 | AC | 7 ms
6,944 KB |
testcase_13 | AC | 16 ms
6,940 KB |
testcase_14 | AC | 11 ms
6,948 KB |
testcase_15 | AC | 12 ms
6,944 KB |
testcase_16 | AC | 17 ms
6,940 KB |
testcase_17 | AC | 27 ms
6,944 KB |
testcase_18 | AC | 2 ms
6,940 KB |
testcase_19 | AC | 1 ms
6,944 KB |
ソースコード
#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 << A[0] << endl; } else { cout << 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; }