ABC198 C - Compass Walking から学んだ





diff 茶色の洗礼か。
全く意味が分からない。

実は過去にも挑戦しており、当時解説を見ているはずだが、全く頭に入らなかった事を覚えている。
さて、今はどうだろう。

かろうじて意味が分かった。
イメージしながら書いてみて、一応通った。

CompassWalking.py
r,x,y= map(int,input().split())

#【重要】
# 二乗のまま使うことで、小数点の誤差を気にせず話を勧められる。
target = x**2 + y**2
ans = 1

#(ans**2)*(r**2) == target のとき、r を ans 歩で丁度ぴったりケースなら break
#(ans**2)*(r**2) >  target のとき、r を ans 歩で丁度超えたばかりのケースなら break
# ==> 丁度超えたばかりのケースを回答として使える理由は入力例 2 , 3 を見てほしい。
#     target を超えた 1 歩と、そのひとつ前の 1 歩を直線ではなく、組み合わせて迂回させることで
#     丁度 target につくことが出来る(問題文で小数点を許したのは、そういう意図か。。気付かなかった)。
while True:
    if (ans**2)*(r**2) >= target:
        break
    else:
        ans += 1

#解説にもある edge case に気を付けたい。最初の一歩が target とピッタリイコールなら問題ない。
#しかし、target を超える歩幅の場合はどうだろうか?その場合は ans = 1 ではなく、ans = 2 となる。
if ans == 1:
    if r**2 > target:
        ans = 2

print(ans)#87ms

解説を聞いた後に、自力でイメージを作りながら書いたが、
それでも悩みながら進めた。
大変勉強をさせてもらった 1 題であった。感謝。


あれからサッパリ忘れて再チャレンジ。
以下で通った。

abc198c.py
R,X,Y = map(int,input().split())
dis = (X**2 + Y**2)**0.5
if dis%R == 0:#数歩でピッタリな場合
    print(int(dis//R))
elif dis < R:#一歩未満にgoalがある場合
    print(2)
else:#上記以外
    print(int(dis//R+1))#27ms

一歩未満にゴールがある場合を思いつくまで WA を引いてしまった。
一発で AC となりたいところだ。