题166.hdu2438 三分-Turn the corner
一、题目
二、题解
依题意知,尽可能让车贴着外面的墙璧转弯,即图中的x轴和y轴,此时只要保证图中直线与y=X交点横坐标在(-Y,0)那么转弯成功。
即对任意的θ∈(0,90°),联立y=x与直线方程得到的x=(X-(l*sin(θ)+w/cos(θ)))/tan(θ)>-Y恒成立。分析知,x为单峰函数,所以用三分法去求出x最小值,如果这个最小值能够大于-Y则转弯成功,反之就转弯失败。
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-6;
const double pi=acos(-1.0);//用cosΠ=-1,借反三角函数acos得到Π
double x,y,l,w;
double cal(double angle)//计算x
{
double res=(x-(l*sin(angle)+w/cos(angle)))/tan(angle);
return res;
}
int main()
{
while(cin>>x>>y>>l>>w)
{
double l=0,r=pi/2,mid1,mid2;//控制枚举区间为图中那个θ角,范围具体控制在0到90°
while(l+eps<r)//三分法找最可能出错的值,即最小的x
{
mid1=l+(r-l)/3;
mid2=r-(r-l)/3;
//哪边更小哪边留下,另一边该为对应mid
if(cal(mid1)<cal(mid2))
{
r=mid2;
}
else
{
l=mid1;
}
}
if(cal(l)<-y)//检验最小的x是否比-Y小,如果是则转弯失败
{
cout<<"no"<<endl;
}
else
{
cout<<"yes"<<endl;
}
}
}
/*
10 6 13.5 4
10 6 14.5 4
yes
no
*/