题意:
给你个90度的转弯,和一辆标准矩形的车,问你这台车能不能拐过去..
思路:
求出靠近最里侧的那条边所在的直线(这个图形右下角为坐标原点)
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;
}