摩天轮 - 正经题解
2025-02-05 10:41:42
发布于:广东
36阅读
0回复
0点赞
超难数学题。
本题分为两步:
- 计算出当他们登上摩天轮 分钟后的坐标。
- 通过坐标计算出角度。
由于摩天轮关于 轴平行,所以此时的旋转坐标公式应为:
,
.
并且因为摩天轮是平行于 轴的,所以 .
最终的公式为 ,.
我们知道仰角和俯角实际上就是两个点构成的直角三角形的角度,如图所示:
就是 看向 的仰角度数。
我们只需要知道 的长度即可套公式 求出。
显然,在本题 就是小码君和小码酱在 平面上的距离, 就是两人的高度差。
说完了,上代码!
#include <iostream>
#include <cstdio>
#include <cmath>
#include <iomanip>
#define int long long
#define float long double
using namespace std;
int n, t;
int xa, ya, xb, yb;
int la, lb;
const float tau = 6.283185307179586;
pair <float, float> get_coord(float len, float theta){//计算移动距离
return {-(len / 2) * sinl(theta), (len / 2) * (1 - cosl(theta))};
}
void solve(){
int time;
cin >> time;
time %= n;
float theta = tau * time / n;
auto cha = get_coord(la, theta), chb = get_coord(lb, theta);
float curya = cha.first + ya, curza = cha.second;//移动距离和原来的坐标加起来就是旋转后的坐标
float curyb = chb.first + yb, curzb = chb.second;
float dx = abs(xa - xb), dy = abs(curya - curyb), dz = abs(curza - curzb);
float dis = sqrtl(dx * dx + dy * dy);//计算AB距离
float ans = atan2l(dz, dis) * (360 / tau);//套公式
cout << setprecision(9) << fixed << ans << '\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> xa >> ya >> la >> xb >> yb >> lb >> t;
while(t--) solve();
return 0;
}
时间复杂度 。
这里空空如也
有帮助,赞一个