CODE THANKS FESTIVAL 2018-H:Median Game
これはわかればシンプルで楽に解けるので好き。
解法
このゲームでは,ある列の中央値がゲームのスコアになり,それを求めよと言われている(偶数のときは2つ候補があるが,大きいほうをとる)。中央値を求める問題では二分探索が有効である。中央値が以上となるか?という質問に答えるには,数列の中により以上の数が半分以上含まれるかを調べるだけでよく,これは比較的容易にできるためである。
それでは,「ゲームのスコアは以上になるか?」という問題に答えよう(この問題はについて答えが単調なので,二分探索が使える)。このとき,Aliceはスコアを大きくしたいので,以上の数を増やしたいはずである。一方Bobは,スコアを小さくしたいので,より小さい数を増やしたいはずである。この2人の戦いをdpによって見守ろう。
- :上から枚目以降のカードが残っているときにAliceの手番で,の最大値
- :上から枚目以降のカードが残っているときにBobの手番で,の最小値
dpの遷移であるが,とりあえずAliceの手番のときを考えよう。今回はこのdpにかけてよいので。について,区間のカードをとり,枚目以降のカードを残してBobに手番を渡すとしよう(のときはゲーム終了という意味)。これらのカードの総和をとすると,との大小によってにを足すかを足すかすればよい。この結果のについての最大値がである。Bobの手番のときも同様である。
dpの遷移は後ろから,つまりから行うことに注意。ゲームでdpをするときの定番だろう。「ゲームのスコアは以上になるか?」という問題の答えは,のときYes,そうでないときNoである。
実装
Submission #4127440 - CODE THANKS FESTIVAL 2018
実装は軽い。dp配列の初期化だけ注意。
本番はほとんど問題文を読まなかったが,もったいなかったかもしれない。