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)
对于这样的一个先增后减的函数,我们可以用三分求出其极大值。
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; }