blogskol

思わず声に出して読みたくなるブログ

ABC135 E - Golf

E - Golf の解説とはちょっと違う解き方

 

(適当なゴルフ用品のリンクを貼るスペース)

 

まず 0 \leq X \leq Y にします(出力の際に -1 倍や swap で直してあげればいいです)

移動回数を n と置くと、移動する道のりは nK 、移動する距離は X+Y と表せます

X+YK の倍数じゃない時は道のりと距離が一致しないのでどこかで相殺(一度目的地と反対方向に向かう無駄な動き)が必要になることがわかります

相殺は [目的地と反対方向に a 動いた後、目的地の方向に a 動くことで元の場所に戻ってくる] でワンセットなので、道のりを偶数分のみ無駄に出来ます

つまり、反対方向へ合計で a だけ動くとおくと nK-2a=X+Y  という式が出来上がります( a は非負整数)

この式を睨むとわかる事として、

  1. これは K が偶数で X+Y が奇数だと無理
  2. そうでないならこの式が成り立つような (n,a) は必ず(たくさん)存在する
  3. AtCoder なので基本的に 2 の (n,a) のうち n が最小なものが答え
  4. 3から基本 aK より大きくはならない( K \leq a なら aKn1 減らせるので)(n=1 の場合はちょっと特殊で、これは簡単なので先に場合分けで潰しておけばいい)

考察は8割くらい終わりで、ここからは実装を考えながら残りの2割を詰めます

n が最小となる (n,a) を求めます(適当にループ書く)

相殺をして貪欲に動きます

相殺パート

while(K \leq a)move(0,-K),a-=K;

move(-a,K-a);*1

貪欲パート
  1. if(目的地までx方向でK以上距離がある) x 方向に K 動いた地点を出力
  2. else if(目的地までy方向でK以上距離がある) y 方向に K 動いた地点を出力
  3. else if(目的地に着いてない) (x,y) を出力

 

Submission #9367764 - AtCoder Beginner Contest 135

 

*1:X \leq YnK-2a=X+Yn \gt 1 という仮定からY \lt K-a のケースを考える必要がない事が大事