给你个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; }