HDU 2438 Turn the corner(三分枚举角度)

来源:互联网 发布:淘宝csv导入怎么开发 编辑:程序博客网 时间:2024/05/21 12:55

题目大意:给你一个拐角,两边的路的宽度分别为x,y。汽车的长和宽分别为h,w。问你这个汽车否转弯成功。

解题思路:如图,枚举角度。


这是一个凸函数所以三分枚举角度。

Turn the corner

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2009    Accepted Submission(s): 765


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?

 

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 410 6 14.5 4
 

Sample Output
yesno
 

Source
2008 Asia Harbin Regional Contest Online
 
#include <iostream>#include<time.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<string>#include<cmath>#include<map>#define eps 1e-10#define PI acos(-1)using namespace std;const int maxn = 220;#define LL long longdouble x, y, l, w;double Del(double ang){    double s = l*cos(ang)+w*sin(ang)-x;    double h = s*tan(ang)+w*cos(ang);    return h;}int main(){    while(cin >>x>>y>>l>>w)    {        double Max = 0.0;        double left = 0;        double right = PI/2.0;        while(right-left > eps)        {            double mid = (right+left)/2.0;            double rmid = (mid+right)/2.0;            double xp1 = Del(mid);            double xp2 = Del(rmid);            if(xp1 > xp2) right = rmid;            else left = mid;            Max = max(Max, max(xp1, xp2));        }        if(Max > y) cout<<"no"<<endl;        else cout<<"yes"<<endl;    }}


0 0