又恬不知耻的开始写题解了,暑假到了,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; } } }
时间: 2024-11-07 00:16:36