hdu2438 三分

题意:
      给你个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
") : printf("no
");
   }
   return 0;
}
   
   
   

原文地址:https://www.cnblogs.com/csnd/p/12063163.html