Official

C - Compass Walking Editorial by kyopro_friends


原点から \((X,Y)\) までのユークリッド距離を \(d\) とします。答えは次の通りです。

  • \(d=R\) のとき \(1\)
  • \(d\neq R\) かつ \(d\leq 2R\) のとき \(2\)
  • それ以外のとき \(\lceil \frac{d}{R}\rceil\)

1つ目のケースは明らかです。

3つ目のケースは、2つ目のケースの成立を仮定すると、「距離が \(2R\) 以下になるまで目的地に真っ直ぐ移動し、残りを(ケース2に基づいて) \(2\) 歩で移動する」とすることで、\(\lceil \frac{d}{R}\rceil\) 歩で到達可能であることがわかります。\(1\) 歩の移動では、目的地までの距離は高々 \(R\) しか減らないのでこれが最小値であることがわかります。

2つ目のケースについて考えます。

厳密な証明は以下の通りです。

証明 移動したい点を \(P\) とする。原点と \(P\) を結ぶ線分の垂直二等分線上の点であって、原点からの距離が \(R\) であるような点が存在するので、これを \(Q\) とする。\(1\) 歩目で \(Q\) に移動し、\(2\) 歩目で \(P\) に移動すれば良い。

より直感的なイメージに基づく説明は以下の通りです。

例えば \(R=2\) のときを考えます。高橋君は \(1\) 歩目で下図の赤い円上の点に移動することができます。

もし \(1\) 歩目で \((2,0)\) に移動した場合、\(2\) 歩目で移動することができるのは、\((2,0)\) を中心とした青い円上の点です。

もし \(1\) 歩目で \((\sqrt{2},\sqrt{2})\) に移動した場合、\(2\) 歩目で移動することができるのは、\((\sqrt{2},\sqrt{2})\) を中心とした青い円上の点です。

このように、赤い円の上の各点を中心とした半径 \(R\) の円を書くことで、原点を中心とした半径 \(2R\) の範囲を尽くせることがわかります。

回答例(Python)

import math

R,X,Y=map(int,input().split())
D=math.sqrt(X*X+Y*Y)

if D==R:
  print(1)
elif D<=R+R:
  print(2)
else:
  print(math.ceil(D/R))

posted:
last update: