Turn the corner
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2059 Accepted Submission(s): 785
Problem Description
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?
![](https://i-blog.csdnimg.cn/blog_migrate/605e6d7e3698d2abbe292059d5224f9c.jpeg)
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?
![](https://i-blog.csdnimg.cn/blog_migrate/605e6d7e3698d2abbe292059d5224f9c.jpeg)
Input
Every line has four real numbers, x, y, l and w.
Proceed to the end of file.
Proceed to the end of file.
Output
If he can go across the corner, print "yes". Print "no" otherwise.
10 6 13.5 4 10 6 14.5 4
yes no
2008 Asia Harbin Regional Contest Online
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2438
题目大意:就是给出如图4个参数,问车子能不能拐过弯
题目分析:推公式,用角度表示出拐弯时骑车离拐点垂直距离最远的点到拐点所在边的距离h,很明显h是凸性的函数,三分角度,求最值,如果最值小于y则可以通过,h = (l * cos(a) + w * sin(a) - x) * (tan(a) + w * cos(a))
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2438
题目大意:就是给出如图4个参数,问车子能不能拐过弯
题目分析:推公式,用角度表示出拐弯时骑车离拐点垂直距离最远的点到拐点所在边的距离h,很明显h是凸性的函数,三分角度,求最值,如果最值小于y则可以通过,h = (l * cos(a) + w * sin(a) - x) * (tan(a) + w * cos(a))
#include <cstdio>
#include <cmath>
double const PI = acos(-1.0);
double const EPS = 1e-7;
double x, y, l, w, s, h;
double cal(double a)
{
s = l * cos(a) + w * sin(a) - x;
return s * tan(a) + w * cos(a);
}
int main()
{
double le, ri, mid1, mid2;
while(scanf("%lf %lf %lf %lf", &x, &y, &l, &w) != EOF)
{
le = 0.0;
ri = PI / 2;
while(fabs(ri - le) > EPS)
{
mid1 = (le + ri) / 2;
mid2 = (mid1 + ri) / 2;
if(cal(mid1) >= cal(mid2))
ri = mid2;
else
le = mid1;
}
if(cal(mid1) <= y)
printf("yes\n");
else
printf("no\n");
}
}