您的位置:首页 > 其它

1005-Turn the corner

2016-04-23 22:10 309 查看
1.1005-Turn the corner

2.题意:街道宽x,要转弯进入的街道宽y,再给出汽车的长度和宽度,问能否通过

3.思路:(参考大神)

为了让车子能顺利通过弯道,我们应该使车子擦着左边那个墙角走,在转弯的过程中,车子的右下端(点p)露在最外面,所以我们只需判断点p能否顺利通过就行。下面就是数学知识了,我们可以建立p的横坐标关于θ的函数,这个画个图可以算出来,》》》

车转弯的时候车有段与地面的夹角角度是从0度变化到90度的。也就是转弯的时候需要一个最大的宽度才能过去。 

否则就卡在那里了。这个宽度PH是先增加后减少的。是个凸型函数,因此是三分求的极值。

直线y的斜率为tan(θ),还经过点(0, Lsin(θ)+D/cos(θ))因此得到y的直线方程。

y=xtan(θ)+Lsin(θ)+D/cos(θ) 

求的PH就是当y=X(汽车当前在的街道的宽度)时,解出的x的值的绝对值。

-x=|x|=(lsinθ+w/cosθ-x)/tanθ; (l==L, D==w)

现在给出其函数表达式:f(θ)=l*cos(θ)-(x*cos(θ)-d)/sin(θ).f(θ)在区间(0,π/2)上先增后减,所以我们需要求出f(θ)的最大值,若f(θ)<=y则车子可以通过,否则不能通过。

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



4.题不在于代码,在于思路,怎么能够想出一个好的方法,需要很多的题锻炼,还是要多刷题。

5.AC代码:

#include<stdio.h>
#include<math.h>
#include<iostream>
#define pi acos(-1)

using namespace std;

double x, y, l, w;

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

int main()
{
while(scanf("%lf%lf%lf%lf",&x,&y,&l,&w)!=EOF)
{
double left=0,right=pi/2,mid,midmid;
while(left+1e-9<=right)
{
mid=(right-left)/3+left;
midmid=(right-left)*2/3+left;
if(cal(mid)>=cal(midmid))
right=midmid;
else
left=mid;
}

if(cal(mid)-y>0)
printf("no\n");
else
printf("yes\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  搜索