ABC198のC問題 Compass Walkingを解いて反省
ABC198のC問題 Compass Walkingを解説します。
解けたのですが、ミスもしましたし、悲しいくらい時間がかかってしまいました。。。
2 次元平面上の原点に高橋君がいます。
高橋君が 1 歩歩くと、いまいる点からのユークリッド距離がちょうど R であるような点に移動することができます(移動先の座標が整数である必要はありません)。これ以外の方法で移動することはできません。
高橋君が点 (X, Y) に到達するまでに必要な歩数の最小値を求めてください。
イメージとしては、直線でできる限りRでまで近づいて、行き過ぎそうになったら遠回りして2回でに着くようにすることを考えました。
求めたい答えである歩数としては、原点からまでの距離をで割って、切り上げます。
なのでソースコードは以下のようにしました。
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を使ったのですが、それでもだめ。。。
最後は自分を疑い、原点からまでの距離よりもが長いケースを思いつきました。。。
というか自分の解き方のイメージの最後の方のところですね。。。
この場合は、答えを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になった時は、計算の精度とかを疑う前に、通らないケースに気づけない自分を疑おうと思います。