Skip to content

Latest commit

 

History

History
79 lines (61 loc) · 1.48 KB

018.md

File metadata and controls

79 lines (61 loc) · 1.48 KB

018 - Statue of Chokudai (★3)

解答

// MSVC で M_PI を使えるように
#ifdef _MSC_VER
# define _USE_MATH_DEFINES
#endif

#include <iostream>
#include <cmath> // std::sin(), std::cos(), std::hypot(), std::atan2()
#include <iomanip> // std::setprecision()

// ラジアンを度数法に変換
double ToDegree(double rad)
{
	return (rad / M_PI * 180.0);
}

int main()
{
	// T 分で一周
	int T;
	std::cin >> T;

	// 観覧車の高さ L
	int L;
	std::cin >> L;

	// (X, Y, 0) に像が存在
	int X, Y;
	std::cin >> X >> Y;

	// 質問が Q 個
	int Q;
	std::cin >> Q;

	// 観覧車の半径
	const double r = (L * 0.5);

	// 観覧車の回転の角速度 (rad/分)
	const double angularVelocity = (2 * M_PI) / T;

	// 浮動小数点数の出力時の精度を 10 桁に
	std::cout << std::setprecision(10);

	for (int i = 0; i < Q; ++i)
	{
		// E 分後
		int E;
		std::cin >> E;

		// 観覧車の回転量 (rad)
		const double angle = (angularVelocity * E);

		// 乗客の Y 座標
		const double y = -std::sin(angle) * r;

		// 乗客の Z 座標
		const double z = (-std::cos(angle) + 1.0) * r;

		// XY 平面(地図平面)上での乗客と像の距離
		const double xyDistance = std::hypot(X, Y - y);

		//       /|
		//      / |
		//     /  | y
		//    /   |
		//   /:  atan2(y, x)
		//  /__:__|______
		//     x
		const double aRad = std::atan2(z, xyDistance);

		// ラジアンを度数法に変換して, 解答を出力
		std::cout << ToDegree(aRad) << '\n';
	}
}