HDU - 2438 Turn the corner(三分)
生活随笔
收集整理的這篇文章主要介紹了
HDU - 2438 Turn the corner(三分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:直接上圖:
給出四個參數:x,y,l,d,分別如圖所示,問汽車能否拐彎成功
題目分析:在這里借個圖:
讓車輛能轉過去的最優解肯定是左側貼著直角點,右側后端的頂點與右墻接觸,如圖所示
那么我們以直角點為原點O建立平面直角坐標系,設拐彎角度為α,則我們需要判斷P點在拐彎途中的最大值與墻體寬度y的大小關系,就可以判斷車輛是否能夠拐過去了
現在我們需要根據任意的α計算出點P的橫坐標,可以根據三角函數輕松推出如下公式:
然后三分找最大值即可,范圍是從0到PI/2
這個題目有個小細節要注意一下,不知道為什么用二分+二分的寫法會WA,必須將[l,r]嚴格分成三份才能A
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #define Pi acos(-1.0) using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e5+100;const double eps=1e-6;double x,y,l,w;double fun(double a) {return l*cos(a)-(x-w/cos(a))/tan(a); }int main() { // freopen("input.txt","r",stdin);while(scanf("%lf%lf%lf%lf",&x,&y,&l,&w)!=EOF){double l=0,r=Pi*0.5;while(fabs(r-l)>eps){ // double mid=(l+r)/2; // double mmid=(mid+r)/2;double mid=l+(r-l)/3;//這個題目必須這樣寫,上面注釋掉的寫法會WAdouble mmid=r-(r-l)/3;if(fun(mid)<fun(mmid))l=mid;elser=mmid;}if(fun(l)<=y)printf("yes\n");elseprintf("no\n");}return 0; }?
總結
以上是生活随笔為你收集整理的HDU - 2438 Turn the corner(三分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 5017 Ellipsoid
- 下一篇: HDU - 4686 Arc of Dr