官方题解|摩天轮
2025-02-04 22:06:55
发布于:北京
75阅读
0回复
0点赞
题目解析
对于任意时刻 ,我们考虑小码君的位置为 ,小码酱的位置为 ,那么二者之间的俯角或仰角度数为:
我们假定摩天轮的位置都是 ,然后根据计算出的位置,加上原来的位置,就可以得出实际的位置。
接下来我们考虑对于位置为 , 高度为 ,匀速转一圈时间为 的摩天轮,小码君或小码酱在 时刻登上摩天轮后,在任意时刻 的位置如何计算。
我们考虑从左侧(或沿 轴正方向一侧)看向摩天轮,将其考虑为一个圆,将高度的一半考虑为其半径。
我们考虑这个圆在一个独立的二维平面坐标系上,其圆心坐标为 ,半径为 。
我们可以根据弧度 和半径 来计算出,在这个圆上任意一点的位置:
考虑摩天轮上一点随时间 ,产生的弧度为 ,由于摩天轮上的起始位置为摩天轮的正下方,所以我们在计算时,这个弧度要减去 ,所以我们最终传入的参数为:
接下来我们考虑计算出的答案如何结合原位置,算出实际位置:
-
对于 轴,摩天轮任意时刻 坐标不变。
-
对于 轴,由于实际上的摩天轮的运动轨迹,我们将独立坐标系上得出的 其映射到实际坐标时,要取相反数,同时加上原来的 轴位置即可。
-
对于 轴,由于单独考虑的圆的圆心为 ,但是实际的摩天轮的中心位置高度为 ,所以计算出的 轴的坐标,要加上 。
AC代码
#include <bits/stdc++.h>
const double PI = std::acos(-1);
auto calc(double r, double p) {
return std::make_pair(r * std::cos(p), r * std::sin(p));
}
int main() {
std::cin.tie(nullptr)->sync_with_stdio(false);
int t; std::cin >> t;
int xa, ya, la, xb, yb, lb;
std::cin >> xa >> ya >> la;
std::cin >> xb >> yb >> lb;
int q; std::cin >> q;
while (q--) {
int s; std::cin >> s;
auto [y0, z0] = calc(la / 2.0, (1.0 * s / t - 0.25) * PI * 2);
auto [y1, z1] = calc(lb / 2.0, (1.0 * s / t - 0.25) * PI * 2);
y0 = -y0 + ya;
y1 = -y1 + yb;
z0 += la / 2.0;
z1 += lb / 2.0;
double res = std::atan2(std::abs(z0 - z1), std::hypot(xa - xb, y0 - y1)) * 180 / PI;
std::cout << std::setprecision(9) << std::fixed << res << '\n';
}
return 0;
}
这里空空如也
有帮助,赞一个