AtCoder Regular Contest 143 C 解答までの流れと嘘解法
競技プログラミングの精進として、AtCoder Regular Contest(ARC) 143 C問題、
Piles of Pebblesを解きました。全テストケース正解(AC)になるまでに考えたことと、
その途中で見つけた嘘解法を紹介します。
問題
下記のページからの引用です。
小石の山が
個あります.最初, N 番目の山には i 個の小石があります. A_i これらを用いて,高橋君と青木君がゲームをします. 高橋君から始めて,交互に次の操作を行い,操作を行えなくなった方が負けとなります.
山を 1 つ以上選び,選んだそれぞれの山から,高橋君の操作の場合は
個ずつ,青木君の操作の場合は X 個ずつ小石を取り除く. ただし,小石の個数が足りない山を選ぶことはできない. Y
二人が最適に行動したとき,どちらがゲームに勝つかを求めてください.
値をシンプルにして二人の最適な行動を考える
この状態であれば
- 先手がいくつか山を選んで
個の石を取るX - 後手が同じ山を選んで
個の石を取るY
ということを繰り返せば、先手がどの山からも石が取れなくなり後手が必勝ということがわかりました。
A_i をより一般化する
上で考えたシンプルな例を基に
改めて
-
から取れる最後の石を取った方が必勝M_i - 各
からは先手、後手のどちらかしか石を取れないか、どちらも石を取れないM_i
ここで何となく先手で
嘘解法
上の感触をコード化してみましたら、、、ACになりました。
でも少し引っかかる点がありましたので、もう少し考察してみました。
例えば、
# t1.txtは上記のテストケース
$ go run main.go < t1.txt
Second
改めて解法を提出
嘘解法は
例えば、先手が
この考察を嘘解法でおかしかったケースも正しくなることも確認し、その他考慮漏れがないか
先手、後手それぞれどのような条件であれば勝てるかを整理しました。
|
先手 | 後手 |
---|---|---|
|
先手が |
|
|
先手が もしくは 先手が石を取った後1つ以上の山から石が取れる |
改めて提出してACになりました。
最後に
今回は精進ですので、それなりの時間をかけて考察をしました。
途中、嘘解法がありましたものの、ARCの問題でACに辿りついたときときは
AtCoder Beginner Contest(ABC)とは違った達成感がありました。
これがコンテスト中にできると、さらにそういった感触が味わえたり、レートの飛躍もできるかなと思います。
残念ながら、私はARCでは中々レートアップすることができないため、
コンテスト時間中にひらめくことが個人的な課題と思います。
Discussion