题意:
小球发射速度为v,求在(0,0)击中(x,y)处的目标,求发射角度。
题解:
设f(a)表示:角度为a,小球的横坐标与目标相同时,小球的高度。
计算可得f(a) = x*tan(a) - (4.9 * x ^2 / v^2) * (tan(a)^2 + 1)
这明显就是一个单峰函数,可用三分法求解峰值。
求解出峰值后,再用二分搜索,求解高度为y的角a.
关于三分搜索可以详见:https://blog.csdn.net/pi9nc/article/details/9666627
#include<bits/stdc++.h>
using namespace std;
double eps=1e-10;
double x,y,v;
double cal(double a)
{
double t = x/(v*cos(a));
return v*sin(a)*t - 9.8/2*t*t;
}
int main()
{
//freopen("t.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf",&x,&y,&v);
double a = acos(-1.0)/2;
if(x==0) //特判,否则三角函数会智障掉
{
if(v*v/2/9.8 > y) printf("%.6lf\n", a);
else printf("-1\n");
continue;
}
double l=0,r=a,mid_l,mid_r,mid;
while(r-l>eps)
{
mid_l=l*2/3+r/3;
mid_r=r*2/3+l/3;
if(cal(mid_l)>cal(mid_r))
{
r=mid_r;
}else
{
l=mid_l;
}
}
//cout<<eps<<"*"<<endl;
if(cal(l)<y)
{
printf("-1\n");
continue;
}
r=l;l=0;
while(r-l>eps)
{
mid=(r+l)/2;
if(cal(mid)<y)
{
l=mid;
}else
{
r=mid;
}
}
printf("%.6lf\n", l);
}
return 0;
}