実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 521
問題概要
個の整数組 が与えられる。以下の条件を満たす長さ の整数列 が存在するか判定し、存在するならば1つ出力せよ。
- 条件 :
- 各 について、 。
制約
- 入力はすべて整数。
考察
重要な考察として、「 または ならば、条件を満たす は存在しない」ということが挙げられる。もし ならば、全ての を にしたとしても より大きくなってしまい、条件2を満たさないからである。 についても同様。
以下、 とする。
このとき、 を初期状態として、各 について次のような貪欲法を取ることで答えを求められる。
- かつ を満たしている限り に1を加える。 に を加える。
イメージとしては各 毎に和を に揃えていく感じだろうか。
すぐに解法が思いつかない場合はとりあえず貪欲解を試してみる、というのも一つの手である。
コード
#include <bits/stdc++.h> using namespace std; #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) using ll = long long; // ======================================== // int main() { int N; cin >> N; vector<ll> L(N), R(N); ll sum_L = 0, sum_R = 0; rep(i, 0, N) { cin >> L[i] >> R[i]; sum_L += L[i]; sum_R += R[i]; } if (sum_L > 0 || sum_R < 0) { cout << "No" << endl; return 0; } else { cout << "Yes" << endl; } vector<ll> ans = L; ll sum = sum_L; rep(i, 0, N) { ll diff = min(R[i] - L[i], -sum); ans[i] += diff; sum += diff; } rep(i, 0, N) { cout << ans[i] << " "; } }
実装時間: 30分