题意:给出x,y,l,d,问汽车能否拐过去。
只需要求汽车下沿抵住下面墙壁时汽车初始左下角点P横坐标最大值就行。f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,三分最大值即可
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; double x,y,l,d; const double pi=acos(-1.0); const double eps=1e-6; double getans(double t) { return l*cos(t)-(x*cos(t)-d)/sin(t); } int main() { while(~scanf("%lf%lf%lf%lf",&x,&y,&l,&d)) { double le=0,ri=pi/2,m1,m2; while(ri-le>=eps) { m1=le+(ri-le)/3,m2=ri-(ri-le)/3; if(getans(m1)<=getans(m2)) le=m1+eps; else ri=m2-eps; } if(getans(le)>y) puts("no"); else puts("yes"); } return 0; }