点击打开链接
给出汽车当前的街道宽度为x,要转弯进入的街道宽度为y,给出汽车的长度和宽度,为能否通过
解题思路:
车转弯的时候车有段与地面的夹角角度是从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)
import java.util.Scanner; import java.util.TreeSet; public class Main { final static double eps=1E-10; static double x,y,d,w; static double solve(double a){ return -(x-w/Math.cos(a)-d*Math.sin(a))/Math.tan(a); } static void make(){ double low=0,high=Math.acos(-1)/2,mid=0; while(low+eps<high){ mid=(low+high)/2; double midmid=(high+mid)/2; if(solve(mid)>solve(midmid)){ high=midmid; } else low=mid; } //System.out.println(solve(low)); if(solve(mid)>y||x<w)System.out.println("no"); ///注意x<w else System.out.println("yes"); } public static void main(String[] args) { Scanner cin=new Scanner(System.in); while(cin.hasNext()){ x=cin.nextDouble(); y=cin.nextDouble(); d=cin.nextDouble(); w=cin.nextDouble(); make(); } } }