典型90【018 – Statue of Chokudai(★3)】をpython解説

Python

AtCoder の問題を解くために必要な実力を付けるために作られた「典型問題」を解いていく企画として、「典型90」があります。

今回は、その内、の18問目である「018 – Statue of Chokudai(★3)」を解説していきたいと思います。
なにか、間違っているところなどありましたら、@EitaSugiまで、ご指導ご鞭撻の程、よろしくお願い致します!

問題名 【018 – Statue of Chokudai(★3)】

018 – Statue of Chokudai(★3)

考察

弧度法度数法を使って求める問題です。俯角を求めるには、

  1. 観覧車の位置を求める
  2. 観覧車と高橋直大像の高さの差、距離の差を求める
  3. arctanで俯角を求める

という流れになります。

観覧車の位置(観覧車が反時計回りなのに注意)

y軸,z軸方向の変化は、

角度| 0 |  90 | 180 | 270 | 360
------------------------------
y軸 | 0 | -L  |  0  |  L  |  0
z軸 | 0 | L/2 |  L  | L/2 |  0

となります。よって、式に直すと、

  • y = -L/2*math.sin(theta)
  • z = L/2 -L/2*math.cos(theta)

となります。(※ thetaは弧度法での値)

ここから、観覧車の位置から直大像のxy平面上の距離とz方向の高さの差を求めます。

2点間の距離を求める

  1. xy平面上の距離
    (直大像のx座標位置-観覧車のy座標位置)^2 +  (直大像のy座標位置-観覧車のy座標位置)^2
  2. z方向の高さの差
    観覧車のz座標の位置(直大像の高さは0のため)

で求まります。

俯角を求める

最後に、arctanを使って、俯角を求めます。
mathライブラリに、辺の長さから角度(弧度法)を求める事のできる関数があるので、それを用います。

典型解法:弧度法と度数法の変換

コード

import sys
def LI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def II(): return int(sys.stdin.readline())
def MI(): return map(int,sys.stdin.readline().rstrip().split())
def S(): return sys.stdin.readline().rstrip()
readline = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)
import math

T = II()
L,X,Y = MI()
def angle(x,y,z):
    leng_X = X-x
    leng_Y = Y-y
    XY = (leng_X**2+leng_Y**2)**(1/2)
    radian = math.atan2(z,XY)
    print(math.degrees(radian))
    
Q = II()
for q in range(Q):
    E = II()
    degree = 360*E/T#度数法
    theta = math.radians(degree)#度数法から弧度法に変換
    y,z = -L/2*math.sin(theta),L/2 -L/2*math.cos(theta)#観覧車の位置を求める
    angle(0,y,z)

まとめ

前の問題【016 – Minimum Coins(★3)】
次の問題【020 – Log Inequality(★3)】

コメント

タイトルとURLをコピーしました