ABC 109 反省

久々にコンテスト中に全完できました. しかし, B問題でWAを連発してしまったため, 大きくペナルティを食らってしまったのは反省事項です.

A問題

問題

A - ABC333

解法

Cを1~3まで試します.

感想

素直に実装しましたが, A* Bが奇数だったら"Yes", そうでなければ"No"です.

B問題

問題

B - Shiritori

解法

次の文字の先頭と今みている文字の尻が一致しているかをみるついでに, mapを用いて初出の文字かチェックをしていたのですが, 最後の文字が初出であるかどうかということを確認しておらず, それに気づかずに論理式に()をつけたり的はずれな修正をして3WA. それを修正したつもりで出すも, 分岐先でreturnしておらず1WA. 計4WAをかましました.

感想

yukicoder解いてるときにWAが出るとすぐテストケースをのぞいてしまう癖があるので, こういう不測のWAに弱いとこがありました. 反省します.

C問題

問題

C - Skip

解法

すべてのx_iに対してXの差分を取り, これら|X-x_i|すべての最大公約数が答えとなります.
x_i , x_{i+1}の間の距離がDの倍数であり, さらにXから距離Dでステップしてどれかのx_iに到達することができれば, Dで数列間を移動することができます. その中での最大のDは, 各iに対して|X-x_i|すべての最大公約数となります.

感想

解法はなんとなく思いついたのですが, 説明がなんとなく難しいです.

D問題

解法

発想が必要になる問題です.
まず, H,Wの制約から, O(HW)の解法が求められます.
これがちょっとしたヒントで, 何度もバックトラックして計算するようなことはなさそうであることがわかります.
操作について考察します.
できるだけ偶数マスを増やしたいときは, 奇数マスのコインをどこかに動かせばよいのですが, ここで動かす方向を下方向に固定してみます.
まず1行目を左から右に見て奇数マスのコインを下に動かし,
次に2行目を...として,最後から2番目の行まで繰り返します.
すると, 最後の1行以外のマスをすべて偶数マスにすることができます.
最後の1行については, 奇数マスのコインを順次右側に動かしていくと, 一番右下のマス以外すべて偶数のマスにすることができます.
コインの総数が奇数だった場合, どうしても奇数のマスは1つできます.
コインの総数が偶数だった場合, すべて偶数のマスにできます. このとき, 右下のマスが奇数で他のマスが偶数ということはありえないので, これが最適解であることがわかります.
あとはpairとvectorなどで移動元と移動先を管理し, 丁寧に実装しましょう.
0-indexedで出力してしまい1-WA.

感想

0-indexedで出力してしまったのはちょっとした悔いですが, 解けてよかったです.

総括

最近難しいABCが続いてましたが, 今回は易しかったように思います. ただ, こういうときにWA量産して順位落としちゃうのはよくないですね.