hdu2348题解

时间:2023-03-08 20:29:21

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

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

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

hdu2348题解

要使汽车能转过此弯道,那么就是汽车的左边尽量贴着那个直角点,而汽车的右下后方的点尽量贴着最下面的边。
我们以O点为原点建立直角坐标系,我们可以根据角a给出P点横坐标的函数F(a)
那么很容易得到:
hdu2348题解
其中有条件:hdu2348题解,可以很容易证明hdu2348题解是一个单峰函数,也可以不用证明,自己用脑子想象一下那个过程,年轻人还是要敢于尝试的,所以接下来就是三分了,如果hdu2348题解的最大值小于等于
y,那么就能通过此直角弯道,否则就通不过。
可以参考:http://blog.****.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-;
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=,right=acos(-1.0)/;
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;
}
}
}