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 となりたいところだ。