这是一道二分的题目,仅用二分的知识也是可以解出来的但是比较麻烦。还需要用到微积分的知识或者需要用到三分法的知识,不懂三分的建议去看看,这里讲一下数学知识解函数。
根据物理分析x,y轴的
x=v*cos(α)*t;
y=v*sin(α)-g*t*t/2;
解方程组就行了g*x*x*tan(α)*tan(α)-2*v0*v0*tan(α)*x+g*x*x+2*v0*v0*y=0求α的最小值。
#include<iostream>
using namespace std;
#include<cmath>
#include<stdio.h>
const double g=9.80000;
const double L=1e-8;
const double PI=3.1415926535898;
double x,y,v;
int main()
{
double m;
double i,j,t;
int N;
cin>>N;
while(N--)
{
cin>>x>>y>>v;
double a=g*x*x;
double b=-2*v*v*x;
double c=g*x*x+2*v*v*y;
if(x==0)
{
if(y==0)cout<<"0.000000"<<endl;
else printf("%.6lf\n",PI/2);
continue;
}
double M=b*b-4*a*c;
if(M<0){cout<<"-1"<<endl;continue;}
double k1=(-b-sqrt(b*b-4*a*c))/(2*a);
double k2=(-b+sqrt(b*b-4*a*c))/(2*a);
if(k1<0)printf("%.6lf\n",atan(k2));
else if(k2<0)printf("%.6lf\n",atan(k1));
else printf("%.6lf\n",atan(k1)<atan(k2)?atan(k1):atan(k2));
}
return 0;
}