又恬不知耻的开始写题解了,暑假到了,QAQ然而想我这样的弱逼是没有暑假的sad,还是老老实实刷题吧。

题目大意:给一个小车的宽度和长度和两条道路的宽度,判断小车能否通过。

思路:可以先看下面的图,我们可以得到高度h的表达式和角度

 

要使汽车能转过此弯道,那么就是汽车的左边尽量贴着那个直角点,而汽车的右下后方的点尽量贴着最下面的边。
我们以O点为原点建立直角坐标系,我们可以根据角a给出P点横坐标的函数F(a)
 
那么很容易得到:
 
其中有条件:,可以很容易证明是一个单峰函数,也可以不用证明,自己用脑子想象一下那个过程,年轻人还是要敢于尝试的,所以接下来就是三分了,如果的最大值小于等于
 
y,那么就能通过此直角弯道,否则就通不过。
可以参考:http://blog.csdn.net/acdreamers/article/details/9989197
下面放上代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double x,y,l,d;
const double pi=3.1415926;
const double eps=1e-7;
double check(double a)
{
    return l*cos(a)+(d-x*cos(a))/sin(a);
}
int main()
{
    //freopen("input","r",stdin);
    while(cin>>x>>y>>l>>d){
        if(d>x||d>y)cout<<"no"<<endl;
        else{
            double left=0,right=acos(-1.0)/2;
            while(left+eps<right){
                double mid=(left+right)/2.0;
                double midd=(mid+right)/2.0;
                if(check(mid)<check(midd))
                    left=mid;
                else
                    right=midd;
            }
            if(check(left)<=y)cout<<"yes"<<endl;
            else cout<<"no"<<endl;
        }
    }
}