您的位置:首页 > 其它

搜索—二分三分搜索—1004

2016-04-21 08:50 363 查看

4000
个题主要是一个公式的推导还有二分法和三分法的综合运用。。

思路:先三分出一个角度,让抛物线在x=x0出的y取得最大值。然后再到这个y一下去二分一个合适的值。

代码:

#include<stdio.h>

#include<algorithm>

#include<string.h>

#include<math.h>

#define PI acos(-1.0)

#define G 9.8

#define eps 1e-12

using namespace std;

double X,Y,v,sita;

double cal(double x)

{

    double t;

    t=X/(v*cos(x));

    return v*sin(x)*t-0.5*G*t*t;

}

double triplediv()

{

    int i;

    double mid1,mid2,left,right,h1,h2;

    left=0,right=0.5*PI;

    for(i=1;i<=100;i++)

    {

        mid1=(2*left+right)/3;

        mid2=(left+2*right)/3;

        h1=cal(mid1);

        h2=cal(mid2);

        if(h1>h2)

        {

            right=mid2;

        }

        else

        {

            left=mid1;

        }

    }

    sita=left;

    return cal(left);

}

void doublediv(double maxy)

{

    int i;

    double left,right,mid,h;

    left=0,right=sita;

    for(i=1;i<=100;i++)

    {

        mid=(left+right)/2;

        h=cal(mid);

        if(h>Y)

            right=mid;

        else

            left=mid;

    }

    printf("%.6lf\n",left);

}

int main()

{

    int t;

    double maxy;

    scanf("%d",&t);

    while(t--)

    {

        scanf("%lf%lf%lf",&X,&Y,&v);

        maxy=triplediv();

        if(maxy<Y)

            printf("-1\n");

        else

            doublediv(maxy);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: