結果
| 問題 |
No.2370 He ate many cakes
|
| ユーザー |
siman
|
| 提出日時 | 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;
}
siman