hdu2438 三分

时间:2021-12-25 10:15:58

题意:

      给你个90度的转弯,和一辆标准矩形的车,问你这台车能不能拐过去..

思路:

hdu2438 三分

     求出靠近最里侧的那条边所在的直线(这个图形右下角为坐标原点) 

     y = x * tan(du) + l * sin(du) + d / cos(du);

     那么我们现在固定y = 题目中的那个 X则,根据(du)的不同,我们可以找到不同的x,

只要-x或者x的绝对值最大的时候小于 题目中的 Y就行了,所以先求反函数

x = y * tan(du) + l * sin(du) + d / cos(du)

则 -y = (-x + l * sin(du) + d / cos(du)) / tan(du) 让他最大就行了,因为他是凸(凹)性的函数所以用三分找(凸(凹)性可以根据二次导数判断). 

#include<stdio.h>
#include<math.h> #define eps 1e-9

double
PI = acos(-1.0);
double
X ,Y ,L ,D; double Fun(double du)
{
return (-
X + L * sin(du) + D / cos(du)) / tan(du);
} bool
solve()
{
if(
X < D || Y < D) return 0;
double
low ,up ,mid ,mmid;
double
dis1 ,dis2;
low = 0;
up = PI / 2;
while(
1)
{

mid = (low + up) / 2;
mmid = (mid + up) / 2;
dis1 = Fun(mid);
dis2 = Fun(mmid);
if(
dis1 > dis2) up = mmid;
else
low = mid;
if(
up - low < eps) break;
}
return
dis1 <= Y;
} int main ()
{
while(~
scanf("%lf %lf %lf %lf" ,&X ,&Y ,&L ,&D))
{

solve()? printf("yes\n") : printf("no\n");
}
return
0;
}