結果
| 問題 | No.3513 Greedy Yokan Party |
| コンテスト | |
| ユーザー |
norioc
|
| 提出日時 | 2026-05-21 00:32:23 |
| 言語 | C++14 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 507 ms / 2,000 ms |
| コード長 | 1,672 bytes |
| 記録 | |
| コンパイル時間 | 1,243 ms |
| コンパイル使用メモリ | 188,664 KB |
| 実行使用メモリ | 17,460 KB |
| 最終ジャッジ日時 | 2026-05-21 00:32:38 |
| 合計ジャッジ時間 | 13,528 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
| 純コード判定待ち |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr ll INF = (1LL << 62);
template <class F>
int bsearch(int low, int high, F pred) {
assert(pred(low));
int lo = low;
int hi = high;
int res = low;
while (lo <= hi) {
int m = (lo + hi) / 2;
if (pred(m)) {
res = max(res, m);
lo = m + 1;
} else {
hi = m - 1;
}
}
return res;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, L;
cin >> N >> L;
int K;
cin >> K;
vector<int> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
vector<int> cakes;
int prev = 0;
for (int a : A) {
cakes.push_back(a - prev);
prev = a;
}
cakes.push_back(L - prev);
int sz = (int)cakes.size();
vector<ll> acc(sz);
partial_sum(cakes.begin(), cakes.end(), acc.begin());
auto can = [&](int m) -> bool {
vector<vector<ll>> dp(sz + 1, vector<ll>(3, -INF));
dp[0][0] = 0;
for (int i = 0; i < sz; i++) {
for (int j = 0; j < 3; j++) {
dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + 1);
}
ll x = (i > 0 ? acc[i - 1] : 0);
int p = lower_bound(acc.begin(), acc.end(), x + m) - acc.begin();
if (p < sz) {
for (int j = 0; j < 2; j++) {
dp[p + 1][j + 1] =
max(dp[p + 1][j + 1], dp[i][j] + 1);
}
}
}
return dp[sz][2] > K;
};
int ans = bsearch(1, L, can);
cout << ans << '\n';
return 0;
}
norioc