搜索—Problem_1004-Toxophily

                   搜索—Problem_1004-Toxophily

题意
射箭问题,Bob要用箭射树上的水果,已知Bob所在坐标为(0,0),输入水果坐标和箭发出的速度,求射箭时箭应该与水平x轴成多少度才能使箭可以射中水果。
解题思路
物理题,简单分析运动状态,箭射出后做曲线运动,加速度为g方向水平向下。如果射出的箭能够达到目标点(x,y)且到达的角度最小,那么到达这个点时,箭的竖直方向上的速度必然是0,或者说是 Vy /g < t 时,这个解必定不是最小的,这也是我们要判断是否为最优解的条件。明确了判断条件,对角的求法,自然是利用二分搜索了,角度范围从0到90度,展开搜索即可。
感想
一道物理题,还好涉及的运动比较简单,要不然又要抓狂了。
AC代码

#include<iostream>
#include<cmath>
#define g 9.8
#define PI acos(-1.0)
using namespace std;

int main()
{
    int T;
    double x,y,v,vx,vy,t,ans;
    cin>>T;
    while(T--)
    {
        cin>>x>>y>>v;
        double low=0;
        double high=PI/2;
        double mid;
        bool flag = false; //判断能不能到达目标点
        while(high-low> 1e-9)
        {
            mid=(low+high)/2;
            vx = v*cos(mid);
            vy = v*sin(mid);
            t = x/vx;
            double h = vy*t-0.5*g*t*t;//求出此角度下可以到达高度 
            if( h < y)
            {
                low = mid;
            }
            else 
                if( h > y || vy/g < t) // 附加条件vy/g < t是用来判断当前的值是不是最小的
                {
                    flag = true; 
                    ans  = mid;
                    high = mid;
                }
                else
                {
                    flag = true; 
                    ans  = mid;
                    break;
                }   
        } 
        if(flag) printf("%.6lf\n",ans);
        else     printf("-1\n");    
    }
}

你可能感兴趣的:(搜索—Problem_1004-Toxophily)