Turn the corner
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1758 Accepted Submission(s): 658
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?
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.
Sample Input
10 6 13.5 4 10 6 14.5 4
Sample Output
yes no
Source
题意:已知汽车的长和宽,l和w,以及俩条路的宽为x和y,汽车所处道路宽为x ,问汽车能否顺利转弯?
第一种思路:
分析:汽车能否顺利转弯取决于在极限情况下,随着角度的变化,汽车离对面路的距离是否大于等于0
如图中
在上图中需要计算转弯过程中h 的最大值是否小于等于y
很明显,随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解
第二种思路:可以根据边界,汽车已经转弯,设水平方向为x轴,垂直方向为y轴。
则汽车的内边界(靠近里面的边界)的直线方程式f(x)为:y=x*tan(a)+l*sin(a)+d/cos(a).其中a是汽车与x轴的夹角
当y=X时,求解出的-x即为汽车的内边界到y轴的距离h,若h小于Y即可转弯,若大于Y就不能转弯。
所以只需要利用方程式,求-x的最大值,即可判断能否通过。
简单来讲,就是判断图中P点的横坐标的绝对值是否小于Y?小于,则可通过;否则,不可通过。
由于f(x)是凸函数(随着x的增大y先增大后减小),所以,需要借助三分求解。(对角度a在[0,90]三分)
图示:
![](http://images.cnitblog.com/blog/422400/201305/14104540-860856ca1df2454c8b18ad0a8fc4b4b2.jpg)
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define MIN 1e-7
#define PI acos(-1.0)
double x,y,l,d;
double Solve(double tmp){
return (-x+l*sin(tmp)+d/cos(tmp))/tan(tmp);
}
int main(){
while(~scanf("%lf%lf%lf%lf",&x,&y,&l,&d)){
double low=0,high=PI/2.0,mid,mmid;
if(x<d||y<d){ puts("no");continue; }
while( high-low>MIN ){
mid=(low+high)/2.0;
mmid=(mid+high)/2.0;
if(Solve(mid)>Solve(mmid))high=mmid+1e-9;
else low=mid-1e-9;
}
if(Solve(mid)<y){
puts("yes");
}else
puts("no");
}
return 0;
}