https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/tasks/code_thanks_festival_2018_b
解説
https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/submissions/3664345
- 結構難しい問題に見える
- 200点問題
- 制約もでかい
ということから、場合分けの方針で考える。
満たすべき条件を考えると
- 2つの玉の個数の差は偶数
- どちらも同じ数の場合は両方削ると-4ずつできるので、4の倍数である必要がある
この2つを使って0にできるか考える。
未証明だけどACできた。
X<Yとして進めていく。
差のd=Y-Xが奇数ならNo
偶数ならd/2回だけ、赤1, 青3を行えるので、赤からd/2, 青からd/2*3を引く。
これで負の数が出てきたり、X=YにならなかったらNo
どちらも同じ数になったので、4の倍数かをチェックする。
そうでないならNo
そうなら、全部消せるのでYes
int X, Y; //--------------------------------------------------------------------------------------------------- #define yes "Yes" #define no "No" string solve() { int d = Y - X; if (d % 2) return no; X -= d / 2; Y -= d / 2 * 3; if (0 <= X and X == Y) { if (X % 4) return no; return yes; } else return no; } //--------------------------------------------------------------------------------------------------- void _main() { cin >> X >> Y; if (X > Y) swap(X, Y); cout << solve() << endl; }