Captain Hammer 题解
题意
飞机以θ角度起飞,速度为V(固定值),给出终点的距离D和速度V,计算起飞的角度θ。
题解
这道题涉及到了物理上的平抛运动(高中物理和大学物理都有涉及到)。
可以将飞机的飞行过程看作是两部分:先是逆向平抛(地面到最高点)和平抛(最高点到地面)。
推导过程
t
a
n
α
=
v
y
v
x
=
g
∗
t
v
x
(
1
)
tanα=\frac{v_y}{v_x}=\frac{g*t}{v_x}(1)
tanα=vxvy=vxg∗t(1)
t = D 2 v x ( 2 ) t=\frac{\frac{D}{2}}{v_x}(2) t=vx2D(2)
v x = V ∗ c o s α ( 3 ) v_x=V*cosα(3) vx=V∗cosα(3)
得出
s
i
n
(
2
α
)
=
g
∗
D
V
2
sin(2α)=\frac{g*D}{V^2}
sin(2α)=V2g∗D
α = a r c s i n ( g ∗ D V 2 ) 2 α=\frac{arcsin(\frac{g*D}{V^2})}{2} α=2arcsin(V2g∗D)
注意点
题目要求精度在10-6内,可以使用eps进行精度处理。
代码
#include<cstdio>
#include<cmath>
using namespace std;
#define PI acos(-1)
#define Equ(a,b) ((fabs((a) - (b)))<(eps))
const double eps = 1e-6;
double solve(int v,int d){
double s = (9.8*d)/pow((double)v,2);
if(Equ(s,1.000000)) s = 1.000000;//防止对asin函数越界,进行精度校正
return asin(s)*180/(PI*2);
}
int main()
{
int t=0;
scanf("%d",&t);
for(int i=0;i<t;++i)
{
int d,v=0;
scanf("%d%d",&v,&d);
printf("Case #%d: %.7lf\n",i+1,solve(v,d));
}
}