AtCoder Regular Contest 094 E - Tozan and Gezan
お題箱より。
解法
プレイヤーを以下のように表記します。
- Aさん: を操作する。先攻。ターン数を最大化したい。
- Bさん: を操作する。後攻。ターン数を最小化したい。
また、 と表記することにします。
もしゲーム開始時点で全ての について だった場合、ゲームは即座に終了し答えは0です。
そうでない場合は和が一定であるという条件から、 は以下のグループに分けられます。
- グループX: であるもの。1箇所以上存在する。
- グループY: であるもの。存在しないかもしれない。
- グループZ: であるもの。1箇所以上存在する。
Aさん→Bさんの順番で、どのような行動を取るのが良いのかを考えていきましょう。
Aさんの行動
Aさんはターンを最大化したいので、 と をなるべく離すように動かしたいです。そのためZグループにはなるべく触らずに、まずはグループXとYの を全て0になるまで減らすのが良さそうです。
その後は仕方がないのでZグループに手を付けますが、ここでの最適手順はどうなるでしょうか。ここで「何が最適か」と考えるとなかなか難しいのですが、少し発想を変えて「このような戦略で動けば、ターン数が必ず○○以上になることが保証できる」ということが言えるような戦略がないか、と考えてみましょう。
全ての値が一致しないとゲームが終わらないこと、Zグループにおいて のほうから増えて近づいてくることはあり得ないことから、Zグループに含まれる のうちどれか1つでも と一致させないようにしていればゲームが終わることはありません。
つまりZグループに含まれるインデックスから何か1つ選んで とし、 を最後まで動かさないようにすることで、Aさんは少なくとも 回以上のターン数を稼げるということになります。
この値をなるべく大きくするには、Zグループの中で が一番小さいものを選べば良いです。以降はこのような を単に と表記します。
Bさんの行動
Bさんは天才なので、先ほどのAさんの戦略をBさんも理解しています。Bさんがどのように動いても 回以上のターン数を稼がれてしまうことは分かっています。
つまりBさんにとっては、もし自分が適切に行動することでターン数をちょうど 回にすることができれば、それが最適だということが分かります。そしてそのような戦略は確かに存在します。
具体的には、Bさんも を最後まで触らずに他の を0になるまで操作し続ければよいです。このときの合計操作回数は 回であり、Bさんが最後の操作をした後に
- インデックス 以外については
- インデックス については
という状態になり、ゲームが終了します。
そのため答えは となります。
ACコード
Submission #5807018 - AtCoder Regular Contest 094
なかなか解説を書くのが難しいですね…解説放送でも「答えを言うのは簡単だけど、分かるように解説するのは難しい」と言われていました。
思いつき勝負の面が強い問題ですが、ゲーム問題で直接最適性を考えるのが難しいときに、「このような戦略で動けば利得が必ず○○以上になることが保証できる」ような戦略はあるだろうか?と考えることは、他の問題でも使える可能性があるテクニックだと思います。