首页 > 代码库 > HDU 2438 Turn the corner(三分枚举角度)
HDU 2438 Turn the corner(三分枚举角度)
题目大意:给你一个拐角,两边的路的宽度分别为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?
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.
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
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 long double 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; } }
HDU 2438 Turn the corner(三分枚举角度)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。