#include<cstdio>
#include<cmath>
#define PI acos(-1.0)
double x,y,v;
inline double calculate(double angle)//已知角度计算所能达到高度的函数
{
double time;
time=x/( v*cos(angle) );
return -0.5*9.8*time*time+v*sin(angle)*time;
}
int main()
{
int t;
double left,right,mid,midmid;
scanf("%d",&t);//输入测试数据的个数t
while(t--)
{
scanf("%lf%lf%lf",&x,&y,&v);//输入果实横坐标x,纵坐标y以及箭离弦时的速度
/*三分查找寻找箭达到果实高度y时的最大角度*/
left=0;right=PI/2;//设置上、下界初值,在0~90°寻找
while(right-left>1e-10)
{
mid=(right+left)/2;//计算中值
midmid=(mid+right)/2;//计算中值
if(calculate(mid)<calculate(midmid))
left=mid;
else
right=midmid;
}
if(calculate(mid)<y)//当所能达到的最大高度无法到达所给高度时,说明箭无法射中果实
printf("-1\n");//输出-1
else//否则
{
/*二分查找满足题设的最小角度*/
left=0;right=mid;//设置上、下界初值,在0~mid寻找
while(right-left>1e-10)
{
mid=(left+right)/2;//设置中值
if(calculate(mid)<y)
left=mid;
else
right=mid;
}
printf("%.6lf\n",left);
}
}
return 0;
}
有更好的理解方法的可以帮忙再解释一下