题目叙述:
Mr. West bought a new car! So he is travelling around the city.<br><br>One day he comes to a vertical corner. The street he is currently in has a width x, the street he wants
to turn to has a width y. The car has a length l and a width d.<br><br>Can Mr. West go across the corner?<br><img src=../../../data/images/2438-1.jpg><br>
Input
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.<br>
Output
If he can go across the corner, print "yes". Print "no" otherwise.<br>
Sample Input
10 6 13.5 4<br>10 6 14.5 4<br>
Sample Output
yes<br>no<br>解题思路:汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。 其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。 这里的Cal函数需要比较繁琐的推倒公式: s = l * cos(θ) + w * sin(θ) - x; h = s * tan(θ) + w * cos(θ); 其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。
代码:
#include<iostream> #include<cmath> #include<iomanip> using namespace std; double x,y,l,w,s,h; double pi=acos(-1.0); double cal(double a) { s = l*cos(a)+w*sin(a)-x; h = s*tan(a)+w*cos(a); return h; } int main() { double left,right,mid,mmid; while(cin>>x>>y>>l>>w) { left=0.0; right=pi/2; while(fabs(left-right)>1e-8) { mid=(left+right)/2; mmid=(mid+right)/2; if(cal(mid)>cal(mmid)) right=mmid; else left=mid; } double max=(cal(mid)); if(cal(mid)<cal(mmid)) max=cal(mmid); if(max<=y) cout<<"yes"<<endl; else cout<<"no"<<endl; } return 0; }