hdu2438 Turn the corner 三分

    思路:显然为了让车子能顺利通过弯道,我们应该使车子擦着左边那个墙角走,在转弯的过程中,车子的右下端(点p)露在最外面,所以我们只需判断点p能否顺利通过就行。下面就是数学知识了,我们可以建立p的横坐标关于θ的函数,这个画个图可以算出来,现在给出其函数表达式:f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,所以我们需要求出f(θ)的最大值,若f(θ)<=y则车子可以通过,否则不能通过。

对于这样的一个先增后减的函数,我们可以用三分求出其极大值。

#include<iostream>
#include<cstdio>
#include<cmath>

using namespace std;
const double PI=acos(-1.0);
const double eps=1.0e-6;
double x,y,l,d;

double f(double t)//计算右下方顶点的横坐标(离第一条竖直线的距离)
{
    return l*cos(t)-(x*cos(t)-d)/sin(t);
}

int main()
{
    double low,up,mid1,mid2;
    while(cin>>x>>y>>l>>d)
    {
        low=0;
        up=PI/2;
        while(up-low>=eps)
        {
            mid1=low+(up-low)/3;
            mid2=up-(up-low)/3;
            if(f(mid1)<=f(mid2))
                low=mid1;
            else
                up=mid2;
        }
        if(f(mid1)<=y)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值