hdu2298.Toxophily

来源:互联网 发布:淘宝关键词设置 编辑:程序博客网 时间:2024/04/29 14:17

这是一道二分的题目,仅用二分的知识也是可以解出来的但是比较麻烦。还需要用到微积分的知识或者需要用到三分法的知识,不懂三分的建议去看看,这里讲一下数学知识解函数。

根据物理分析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;
}

0 0
原创粉丝点击