您的位置:首页 > 其它

搜索初步-1005

2016-04-27 23:19 393 查看
[align=left]Problem Description[/align]
Mr. West bought a new car! So he is travelling around the city.
One day he comes to a vertical corner. The street he is currently in has a width x, the street he wants to turn to has a width y. The car has a length l and a width d.
Can Mr. West go across the corner?
 

[align=left]Input[/align]
Every line has four real numbers, x, y, l and w.<br>Proceed to the end of file.

[align=left]Output[/align]
If he can go across the corner, print "yes". Print "no" otherwise.<br>
 

[align=left]Sample Input[/align]

10 6 13.5 410 6 14.5 4

 

[align=left]Sample Output[/align]

yesno汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。
其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。

这里的Calc函数需要比较繁琐的推倒公式:
s = l * cos(θ) + w * sin(θ) - x;
h = s * tan(θ) + w * cos(θ);
其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。

3分搜索法
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define eps 1e-8

struct point
{
double x;
double y;
};
double w1,w2,l,d;

double cross(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

double cal(double x)
{
point t1,t2,p0;
double s,y,h;
y=sqrt(l*l-x*x);
t1.x=w1-x,t1.y=-w2;
t2.x=w1,t2.y=-(w2-y);
p0.x=0,p0.y=0;
s=fabs(cross(t1,t2,p0));
h=s/l;
return h;
}

void solve()
{
int i;
double left,right,mid1,mid2,h1,h2;
left=0,right=l;
for(i=0;i<=100;i++)
{
mid1=(left*2+right)/3;
mid2=(left+right*2)/3;
h1=cal(mid1);
h2=cal(mid2);
if(h1>h2)
{
left=mid1;
}
else
{
right=mid2;
}
}
double H=cal(left);
if(H-d>0)
printf("yes\n");
else
printf("no\n");
}

int main()
{
while(scanf("%lf%lf%lf%lf",&w1,&w2,&l,&d)!=EOF)
{
if(d>=w1||d>=w2)
{
printf("no\n");
continue;
}
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索初步