ABC198のC問題 Compass Walkingを解いて反省

ABC198のC問題 Compass Walkingを解説します。
解けたのですが、ミスもしましたし、悲しいくらい時間がかかってしまいました。。。

atcoder.jp

2 次元平面上の原点に高橋君がいます。

高橋君が 1 歩歩くと、いまいる点からのユークリッド距離がちょうど R であるような点に移動することができます(移動先の座標が整数である必要はありません)。これ以外の方法で移動することはできません。

高橋君が点 (X, Y) に到達するまでに必要な歩数の最小値を求めてください。

イメージとしては、直線でできる限りRで (X, Y)まで近づいて、行き過ぎそうになったら遠回りして2回で (X, Y)に着くようにすることを考えました。

解き方のイメージ
解き方のイメージ

求めたい答えである歩数としては、原点から (X, Y)までの距離 \sqrt{X^2 + Y^2} Rで割って、切り上げます。

なのでソースコードは以下のようにしました。

from math import sqrt, ceil
R, X, Y = map(int, input().split())
kyori = sqrt(X ** 2 + Y ** 2)
ans = ceil(kyori / R)
print(ans)

ところが、3つのケースでWrong Answerとなりました。
sqrtの精度を疑って、Decimalを使ったのですが、それでもだめ。。。

最後は自分を疑い、原点から (X, Y)までの距離よりも Rが長いケースを思いつきました。。。
というか自分の解き方のイメージの最後の方のところですね。。。

f:id:hrksb5029:20210412010009p:plain

この場合は、答えを2としています。

最終的なコードは以下のようになりました。

from math import sqrt, ceil
R, X, Y = map(int, input().split())
kyori = sqrt(X ** 2 + Y ** 2)
if kyori < R:
    print(2)
    exit()
ans = ceil(kyori / R)
print(ans)

今後は、微妙なラインでWrong Answerになった時は、計算の精度とかを疑う前に、通らないケースに気づけない自分を疑おうと思います。