[yukicoder] No. 0944 煎っぞ!
問題
方針
コーヒー豆のおいしさ度の候補は、累積和の数だけあるので、\( N \) 通りあることがわかります。ここで、累積和を
\[s_i = \sum_{k = 1}^{i} a_k\]
とします。おいしさ度を \( s_i \) と固定したとき、条件を満たすような分割方法があるかは、分割済みのコーヒー豆のおいしさ度の総和を \( s \) として、\( i + 1 \) 以降の累積和において、\( s_j = s + s_i \) となるような \( j \) が存在することを確かめれば良いです。これを、\( j = N \) まで行います。
コード
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int N; cin >> N; int a[N]; vector<int> b(N + 1); b[0] = 0; for (int i = 0; i < N; i++) { cin >> a[i]; b[i + 1] = b[i] + a[i]; } int ans = 1; int s = 0; for (int i = 0; i < N; i++) { int v = b[i + 1]; s = v; int t = 0; int l = i + 2; int cnt = 1; while (l <= N) { auto it = lower_bound(b.begin() + l, b.end(), v + s); int id = it - b.begin(); if (b[id] == v + s) { s = b[id]; l = id; cnt++; } else { break; } if (id == N) { ans = max(ans, cnt); } } } cout << ans << "\n"; return 0; }
ディスカッション
コメント一覧
まだ、コメントがありません