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가 되고 싶은 곳이다.

좋은 웹페이지 즐겨찾기