E - Golf の解説とはちょっと違う解き方
(適当なゴルフ用品のリンクを貼るスペース)
まず にします(出力の際に
倍や swap で直してあげればいいです)
移動回数を と置くと、移動する道のりは
、移動する距離は
と表せます
が
の倍数じゃない時は道のりと距離が一致しないのでどこかで相殺(一度目的地と反対方向に向かう無駄な動き)が必要になることがわかります
相殺は [目的地と反対方向に 動いた後、目的地の方向に
動くことで元の場所に戻ってくる] でワンセットなので、道のりを偶数分のみ無駄に出来ます
つまり、反対方向へ合計で だけ動くとおくと
という式が出来上がります(
は非負整数)
この式を睨むとわかる事として、
- これは
が偶数で
が奇数だと無理
- そうでないならこの式が成り立つような
は必ず(たくさん)存在する
- AtCoder なので基本的に 2 の
のうち
が最小なものが答え
- 3から基本
は
より大きくはならない(
なら
を
、
を
減らせるので)(
の場合はちょっと特殊で、これは簡単なので先に場合分けで潰しておけばいい)
考察は8割くらい終わりで、ここからは実装を考えながら残りの2割を詰めます
が最小となる
を求めます(適当にループ書く)
相殺をして貪欲に動きます
相殺パート
貪欲パート
- if(目的地までx方向で
以上距離がある) x 方向に
動いた地点を出力
- else if(目的地までy方向で
以上距離がある) y 方向に
動いた地点を出力
- else if(目的地に着いてない) (x,y) を出力
Submission #9367764 - AtCoder Beginner Contest 135
*1:、
、
という仮定から
のケースを考える必要がない事が大事