面白かった。間違いやすいけど、このくらいなら!!!
問題概要
長さ の正の整数からなる二つの数列 、 が与えられる。以下の操作を好きな順序で好きな回数だけ行える。 と が一致するようにすることは可能か?
- の要素を一つ選んで する
- の要素を一つ選んで する
制約
考えたこと
とりあえず、 の方が全体的に小さい必要がありそう。極端な話、すべての index について、a[ i ] <= b[ i ] であれば、全然可能である。
よって話は、a[ i ] > b[ i ] となっているような場所をいかにして補償するかである。
- a[ i ] > b[ i ] のところについて、b[ i ] に 1 を足す代わりに
- a[ j ] < b[ j ] のところについて、a[ j ] に 2 を足す
という風にしていく。その結果、すべての index について a[ i ] <= b[ i ] とにう状態になれば "Yes"、そうでなければ "No" だ。
#include <bits/stdc++.h> using namespace std; int main() { int N; cin >> N; vector<long long> a(N), b(N); for (int i = 0; i < N; ++i) cin >> a[i]; for (int i = 0; i < N; ++i) cin >> b[i]; long long biggerA = 0, biggerB = 0; for (int i = 0; i < N; ++i) { if (a[i] > b[i]) biggerA += a[i] - b[i]; if (b[i] > a[i]) biggerB += (b[i] - a[i])/2; } if (biggerB >= biggerA) cout << "Yes" << endl; else cout << "No" << endl; }