思路:显然为了让车子能顺利通过弯道,我们应该使车子擦着左边那个墙角走,在转弯的过程中,车子的右下端(点p)露在最外面,所以我们只需判断点p能否顺利通过就行。下面就是数学知识了,我们可以建立p的横坐标关于θ的函数,这个画个图可以算出来,现在给出其函数表达式:f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,所以我们需要求出f(θ)的最大值,若f(θ)<=y则车子可以通过,否则不能通过。
对于这样的一个先增后减的函数,我们可以用三分求出其极大值。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const double PI=acos(-1.0);
const double eps=1.0e-6;
double x,y,l,d;
double f(double t)//计算右下方顶点的横坐标(离第一条竖直线的距离)
{
return l*cos(t)-(x*cos(t)-d)/sin(t);
}
int main()
{
double low,up,mid1,mid2;
while(cin>>x>>y>>l>>d)
{
low=0;
up=PI/2;
while(up-low>=eps)
{
mid1=low+(up-low)/3;
mid2=up-(up-low)/3;
if(f(mid1)<=f(mid2))
low=mid1;
else
up=mid2;
}
if(f(mid1)<=y)
printf("yes\n");
else
printf("no\n");
}
return 0;
}