您的位置:首页 > 其它

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的绝对值增大再减小,单峰函数。可以用三分求出最大值。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  三分