题目描述
Mr. West bought a new car! So he is travelling around the city.
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.
Can Mr. West go across the corner?
Input
Every line has four real numbers, x, y, l and w.
Proceed to the end of file.
Output
If he can go across the corner, print “yes”. Print “no” otherwise.
Sample Input
10 6 13.5 4
10 6 14.5 4
Sample Output
yes
no
大意
求长为l,宽为w的汽车能否通过前后道路宽度依次为x与y的90度直角弯道
思考
很明显,这是一道数学题,公式的推导过程很是麻烦,我也是参考了题解才推导出正确的公式,主要参考了这篇博客。
这是一个凸性函数,因此我用了三分搜素法来做
AC代码
#include <iostream>#include <stdio.h>#include <math.h>using namespace std;double pi = acos(-1.0);double x,y,l,w,s,h;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,midmid;while(scanf("%lf%lf%lf%lf",&x,&y,&l,&w)!=EOF){left = 0.0;right = pi/2;while(fabs(right-left)>1e-8){mid = (left+right)/2;midmid = (mid+right)/2;if(cal(mid)>=cal(midmid))right = midmid;else left = mid;}if(cal(mid)<=y)printf("yes ");else printf("no ");}return 0;}//三分法程序
做这道题好像做高中的数学题(不过好难)。。。。