自分用メモ

プログラミングとかのメモを書きたいです

競プロ典型90問:018 - Statue of Chokudai(★3)

問題

https://atcoder.jp/contests/typical90/tasks/typical90_r

挑戦結果

  • 結果:解けた
  • 時間:40分ぐらい

考えたこと

  • 俯角とはなにかを調べた
  • 数式一発な問題と思った
  • E869120 君の座標(x,y,z)の計算式を求めた
  • 高橋直大像との俯角に必要な三角形を求めた
  • 点1:高橋直大像 (X,Y,0)
  • 点2:E869120君の座標 (eX, eY, eZ)
  • 点3:E869120君をXY平面上に落とした場所 (eX, eY, 0)
  • 辺の長さから角度を求めるために、atan2を使用した

公式解説

https://twitter.com/e869120/status/1384276005330690049/photo/1

解説を読んだふりかえり

  • ただ三角関数と書いてあった。数式作るだけなので、もっと早くときたいところ。
  • 3次元空間を脳内か紙面上で上手に描けないと駄目だな。

ソース

from math import sin, cos, pi, atan2, degrees, sqrt
T = int(input())
L,X,Y = [int(x) for x in input().split()]
Q = int(input())
E = []
for _ in range(Q):
    E.append(int(input()))

# t秒時点のE869120君の座標
def xyz(t):
    x = 0
    y = -L/2 * sin(2*pi*t/T)
    z = L/2 - L/2 * cos(2*pi*t/T)
    return x,y,z

# t秒時点の答え
def ans(t):
    eX,eY,eZ = xyz(t)
    return degrees(atan2(eZ, sqrt((X-eX)**2 + (Y-eY)**2)))


# print(xyz(0))
# print(xyz(T/4))
# print(xyz(T/2))
# print(xyz(3*T/4))

for e in E:
    print(ans(e))