hdu2438 Turn the corner 三分

    思路:显然为了让车子能顺利通过弯道,我们应该使车子擦着左边那个墙角走,在转弯的过程中,车子的右下端(点p)露在最外面,所以我们只需判断点p能否顺利通过就行。下面就是数学知识了,我们可以建立p的横坐标关于θ的函数,这个画个图可以算出来,现在给出其函数表达式:f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,所以我们需要求出f(θ)的最大值,若f(θ)<=y则车子可以通过,否则不能通过。

对于这样的一个先增后减的函数,我们可以用三分求出其极大值。

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

using namespace std;
const double PI=acos(-1.0);
const double eps=1.0e-6;
double x,y,l,d;

double f(double t)//计算右下方顶点的横坐标(离第一条竖直线的距离)
{
    return l*cos(t)-(x*cos(t)-d)/sin(t);
}

int main()
{
    double low,up,mid1,mid2;
    while(cin>>x>>y>>l>>d)
    {
        low=0;
        up=PI/2;
        while(up-low>=eps)
        {
            mid1=low+(up-low)/3;
            mid2=up-(up-low)/3;
            if(f(mid1)<=f(mid2))
                low=mid1;
            else
                up=mid2;
        }
        if(f(mid1)<=y)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}


 

你可能感兴趣的:(hdu2438 Turn the corner 三分)