码迷,mamicode.com
首页 > 其他好文 > 详细

hdu2348题解

时间:2016-07-06 00:02:33      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

又恬不知耻的开始写题解了,暑假到了,QAQ然而想我这样的弱逼是没有暑假的sad,还是老老实实刷题吧。

题目大意:给一个小车的宽度和长度和两条道路的宽度,判断小车能否通过。

思路:可以先看下面的图,我们可以得到高度h的表达式和角度

 

技术分享

要使汽车能转过此弯道,那么就是汽车的左边尽量贴着那个直角点,而汽车的右下后方的点尽量贴着最下面的边。
我们以O点为原点建立直角坐标系,我们可以根据角a给出P点横坐标的函数F(a)
 
那么很容易得到:
技术分享
 
其中有条件:技术分享,可以很容易证明技术分享是一个单峰函数,也可以不用证明,自己用脑子想象一下那个过程,年轻人还是要敢于尝试的,所以接下来就是三分了,如果技术分享的最大值小于等于
 
y,那么就能通过此直角弯道,否则就通不过。
可以参考:http://blog.csdn.net/acdreamers/article/details/9989197
下面放上代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double x,y,l,d;
const double pi=3.1415926;
const double eps=1e-7;
double check(double a)
{
    return l*cos(a)+(d-x*cos(a))/sin(a);
}
int main()
{
    //freopen("input","r",stdin);
    while(cin>>x>>y>>l>>d){
        if(d>x||d>y)cout<<"no"<<endl;
        else{
            double left=0,right=acos(-1.0)/2;
            while(left+eps<right){
                double mid=(left+right)/2.0;
                double midd=(mid+right)/2.0;
                if(check(mid)<check(midd))
                    left=mid;
                else
                    right=midd;
            }
            if(check(left)<=y)cout<<"yes"<<endl;
            else cout<<"no"<<endl;
        }
    }
}

 

hdu2348题解

标签:

原文地址:http://www.cnblogs.com/dbwater/p/5645243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!