HDU 2438 Turn the corner
2015-07-20 14:18
357 查看
这题目有意思,给出汽车的长L和宽D,给出一个拐角的两条路的宽X,Y,问汽车能不能顺利转弯通过。
思路,汽车过去肯定是要转弯的,我们可以对汽车左边界建立直线方程
直线y的斜率为tan(θ),还经过点(0, Lsin(θ)+D/cos(θ))因此得到y的直线方程。y=xtan(θ)+Lsin(θ)+D/cos(θ)
求的PH就是当y=X(汽车当前在的街道的宽度)时,解出的x的值的绝对值。如果x的绝对值大于等于Y就说明过不去。可以发现随着角度的增大,x的绝对值增大再减小,单峰函数。可以用三分求出最大值。
思路,汽车过去肯定是要转弯的,我们可以对汽车左边界建立直线方程
直线y的斜率为tan(θ),还经过点(0, Lsin(θ)+D/cos(θ))因此得到y的直线方程。y=xtan(θ)+Lsin(θ)+D/cos(θ)
求的PH就是当y=X(汽车当前在的街道的宽度)时,解出的x的值的绝对值。如果x的绝对值大于等于Y就说明过不去。可以发现随着角度的增大,x的绝对值增大再减小,单峰函数。可以用三分求出最大值。
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; const double pi = acos(-1.0); double x,y,l,d; double check(double mid)//求出x的绝对值 { return (-x + l * sin(mid) + d / cos(mid)) / tan(mid); } int main() { while(~scanf("%lf%lf%lf%lf",&x,&y,&l,&d)) { if(x < d || y < d) { printf("no\n"); continue; } double l = 0,r = pi / 2.0, mid, midmid; while(r - l > 1e-7)//三分角度 { mid = (l + r) / 2; midmid = (mid + r) / 2; if(check(mid) > check(midmid)) r = midmid; else l = mid; } if(check(mid) < y) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- HDU4355--Party All the Time,HDU3714--Error Curvese三分法
- HDU 4717 The Moving Points
- [HDU4355][三分]Party All The Time
- 三分之hihocoder1142
- 三分之ZOJ3203
- 三分之HDU3714
- Trick or Treat
- hdu 3714
- URAL 1874 Football Goal 均值不等式&三分
- 【算法分析】之重新认识三分-----求极值(极大值和极小值)
- poj3737UmBasketella三分法求极值
- ZOJ 3203 Light Bulb (三分+计算几何)
- 题目3 : 活动中心
- HDOJ 4355 —— 三分
- 二分和三分模板
- CF 8D Two Friends 【二分+三分】
- PKU3301
- HDU3756
- HDU2899超级简单基础的三分
- 基站选址