题目来源:
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 "); else puts("yes"); } return 0; }