zoukankan      html  css  js  c++  java
  • HDU 2438 Turn the corner【三分】

    题目大意:
    给出汽车当前的街道宽度为x,要转弯进入的街道宽度为y,给出汽车的长度和宽度,为能否通过
    解题思路:如果给我一道三分的题目,我还真的不知道往哪里去想。看到这个大牛的博客才知道思路是怎样的
    http://hi.baidu.com/novosbirsk/item/b52cd716a2068d463a176e07 

    车转弯的时候车有段与地面的夹角角度是从0度变化到90度的。也就是转弯的时候需要一个最大的宽度才能过去。 

    否则就卡在 那里了。这个宽度PH是先增加后减少的。是个凸型函数,因此是三分求的极值。

    直线y的斜率为tan(θ),还经过点(0, Lsin(θ)+D/cos(θ))因此得到y的直线方程。

    y=xtan(θ)+Lsin(θ)+D/cos(θ) 

    求的PH就是当y=X(汽车当前在的街道的宽度)时,解出的x的值的绝对值。

    -x=|x|=(lsinθ+w/cosθ-x)/tanθ; (l==L, D==w)

    代码如下:

    View Code
    /*
    HDU 2438 Turn the corner
    */
    #include<stdio.h>
    #include<math.h>
    #define pi acos(-1)
    double x, y, l, w;
    double cal(double t)
    {
        return (l*sin(t)+w/cos(t)-x)/tan(t);
    }
    int main()
    {
        while(scanf("%lf%lf%lf%lf", &x, &y, &l, &w)!=EOF)
        {
            double left=0, right=pi/2,  mid, midmid;
            while(left+1e-9<=right)
            {
                /*
                mid=(left+right)/2;
                midmid=(mid+right)/2;  //这样就是WA的,真心不懂... 
                */
                mid=(right-left)/3+left;
                midmid=(right-left)*2/3+left;
                if(cal(mid)>=cal(midmid))
                    right=midmid;
                else
                    left=mid;
            }
            if(cal(mid)-y>0)
                printf("no\n");
            else
                printf("yes\n");
        }
        return 0;
    }
  • 相关阅读:
    Android CheckBox的监听事件
    sqlite实现用户数据储存
    论面向服务架构设计及其应用
    聊聊架构阅读笔记(3)
    第九周学习总结
    pip下载报错cannot import name 'FormatControl'
    第八周学习总结
    聊聊架构阅读笔记(2)
    阅读笔记
    第七周学习总结
  • 原文地址:https://www.cnblogs.com/Hilda/p/2940120.html
Copyright © 2011-2022 走看看