LoginSignup
0
0

More than 1 year has passed since last update.

ABC198 C - Compass Walking から学んだ

Last updated at Posted at 2021-09-28

abc198_1.png
abc198_2.png
abc198_3.png
abc198_4.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0