【競プロ典型90問】「018 - Statue of Chokudai(★3)」解法

このシリーズではE869120さんによって作成された競プロ典型90問をPythonで解いています。

問題

018 - Statue of Chokudai(★3)

ポイント

一旦問題の状況を図にしてみました。

観覧車ですが、平面 x=0 上にあるのでy軸とz軸だけ考えれば良さそうです。

Ei分後の観覧車から見た高橋直大像の俯角は、図の赤の角度となります。
※ちなみに「俯角って何?」って方は以下の記事が参考になります。
高校数学ⅠA 三角比「相似からsin, cos, tan の意味を考える。仰角と俯角も」

ここで、平行線の錯覚の性質により、赤の角度と青の角度は同一となります。

ピンクの三角形に注目すると、青の角度は辺a,bのアークタンジェントとなります。
※「アークタンジェントって何?」という方は下記記事がお役に立つかと!
たったの1分でわかる!アークタンジェントの基本【微分・積分】

ここで、Ei分後におけるE869120 君の位置を(0,y,z)、高橋直大像の位置を (X,Y,0)とすると
辺a,bの長さは下記のように求めることができます。

ここまで大分長くなってしまいましたが…まとめると
 ・今回の問題は赤の角度を求めることがゴール
 ・赤の角度は青の角度と同じ
 ・青の角度を求めるために
   ①Ei分後におけるE869120 君の位置を求める
   ②辺a,bの長さを求める
   ③辺a,bのアークタンジェントを求める
 といった手順で解いていきます。

Ei分後におけるE869120 君の位置を求めるのも少し曲者なので補足しておきます。
Ei分後における観覧車の角度をθとすると、
 E869120 君のx座標は 0(固定)
 E869120 君のy座標は -L / 2 * sin(θ)
 E869120 君のz座標は L / 2 - cos(θ) * L / 2
となります。
※三角関数に親しみが無い方だと、これを初見で理解するのは結構骨が折れる作業です。
単位円の三角関数について学んだ後、色々値を入れてみて実際に計算すると理解が早まると思います。

以上を踏まえ、実装したコードがこちらです。

コード

def main():
    import sys
    from math import pi, sin, cos, atan
    sys.setrecursionlimit(10 ** 9)
    input = sys.stdin.readline

    T = int(input())
    L, X, Y = map(int, input().split())

    # Ei分後における、E869120君から見た高橋直大像の俯角を求める関数
    def cal(e):
        theta = e / T * 2 * pi  # Ei分後の観覧車の回転角度
        y = - L / 2 * sin(theta)  # Ei分後のE869120君のy座標
        z = L / 2 - cos(theta) * L / 2  # Ei分後のE869120君のz座標
        b = (X ** 2 + (Y - y) ** 2) ** (1/2)    # Ei分後の辺bの長さ
        ans = atan(z / b) / pi * 180  # 辺aとbのアークタンジェント

        return ans

    Q = int(input())
    for _ in range(Q):
        E = int(input())
        print(cal(E))


if __name__ == '__main__':
    main()
おすすめの記事