zoukankan      html  css  js  c++  java
  • HDUOJ2298三分加二分

    首先这题是一道物理题,需要我们根据题意抽象一个函数出来。对物体的运动作分解后,可以得到:

    f(t)=x*tan(t)-g*x*x/(v*cos(t))^2/2,其中t表示v与x轴正向的夹角(弧度),f(t)表示物体的运动轨迹与直线x0=x的交点纵坐标。

    分析后可以得到该函数在区间(0,π/2)上先增后减,所以我们可以在该区间上三分,求出使函数取得极大值的角度t0。若f(t0)<y,则无解;否则对区间(0,t0)二分,找到使得f(t)=y的t值,即为所求。

    #include<iostream>
    #include<cstdio>
    #include<cmath>

    using namespace std;
    const double eps=1.0e-9;
    const double PI=acos(-1.0);
    const double g=9.8;
    double x,y,v;

    double f(double t)
    {
        return x*tan(t)-g*x*x/2/(v*v*cos(t)*cos(t));
    }

    double two_devide(double low,double up)
    {
        double m;
        while(up-low>=eps)
        {
            m=(up+low)/2;
            if(f(m)<=y)
                low=m;
            else
                up=m;
        }
        return m;
    }

    double three_devide(double low,double up)
    {
        double m1,m2;
        while(up-low>=eps)
        {
            m1=low+(up-low)/3;
            m2=up-(up-low)/3;
            if(f(m1)<=f(m2))
                low=m1;
            else
                up=m2;
        }
        return (m1+m2)/2;
    }

    int main()
    {
        int t;
        double maxt;
        cin>>t;
        while(t--)
        {
            cin>>x>>y>>v;
            maxt=three_devide(0,PI/2);
            if(f(maxt)<y)
                printf("-1 ");
            else
                printf("%.6lf ",two_devide(0,maxt));
        }
        return 0;
    }

  • 相关阅读:
    C++中的friend函数详细解析(一)
    【图像处理算法】 直方图均衡化
    可降水量W:空中水文学名词初集(4)
    excel\docx
    WebService学习总结
    C#深入学习笔记Lock
    事件Event深入总结
    C#泛型委托与Lambda总结
    SQLServer事务与锁的基础概念总结
    委托Delegate深入总结
  • 原文地址:https://www.cnblogs.com/Skyxj/p/3184273.html
Copyright © 2011-2022 走看看