题目来源:

http://acm.hrbeu.edu.cn/index.php?act=problem&id=1280

 

显然我们知道,当左车尾碰到边,前左车到水平的距离h大于 Y,显然是不通过的。 于是我们想求, 这个h到底是多少,我们可以建立h(θ)函数, θ是车与水平的夹角,h(θ)是先增大后减小,为一个凸函数, 恰好最大值为我们需要求的值h.我们用三分的思想做, 即可。

计算公式为:

s为车右前到拐角水平线的距离。

s=cos(θ) * l - x + sin(θ) * d;

h= tan(θ) *s + d * cos(θ);

代入h = l* sin(θ) - x * tan(θ) + d/ cos(θ);

 

代码如下:

using namespace std ;
const double pi= acos(-1);
const double EPS = 1e-9;
typedef long long LL ;
double x, l, d, y;
double high(double sita){
    return l * sin(sita) - x* tan(sita) + d / cos(sita);
}
double tri_search(){
    double l,r,mid,midmid;
    l=0;
    r=pi / 2;
    while(l + EPS < r){
        mid=(l + r)  *0.5;
        midmid= (mid + r) * 0.5;
        if( high(mid) >= high(midmid) )
            r=midmid;
        else l=mid;
    }
    return (l + r)*0.5;
}
int main(){
    while(scanf("%lf%lf%lf%lf",&x,&y,&l,&d)!= EOF){
        if(high(tri_search()) >y )
            printf("no\n");
        else
            puts("yes");
    }
    return 0;
}