HihoCoder - 1142 ,三分入门
先来说说三分的思想:
从三分法的名字中我们可以猜到,三分法是对于需要逼近的区间做三等分:
我们发现lm这个点比rm要低,那么我们要找的最小点一定在[left,rm]之间。如果最低点在[rm,right]之间,就会出现在rm左右都有比他低的点,这显然是不可能的。
同理,当rm比lm低时,最低点一定在[lm,right]的区间内。 利用这个性质,我们就可以在缩小区间的同时向目标点逼近,从而得到极值。
题目如下:
在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。
代码实现如下:
import java.util.Scanner; public class Main { static final double eps = 0.0000001; static double a,b,c,x,y; public static void main(String []args) { Scanner cin = new Scanner(System.in); a = cin.nextDouble(); b = cin.nextDouble(); c = cin.nextDouble(); x = cin.nextDouble(); y = cin.nextDouble(); double t = (-b)/(2*a); double l,r; if(x < t) { l = -200; r = t; } else { l = t; r = 200; } while(l + eps < r)//这个循环是三分体现的地方,也是最重要的地方 { double mid = (l+r)/2; double midmid = (mid+r)/2; double mid_v = solve_dis(mid); double midmid_v = solve_dis(midmid); if(mid_v >= midmid_v) { l = mid; } else { r = midmid; } } System.out.printf("%.3f",Math.sqrt(solve_dis(r))); } static double solve_dis(double x1) { double y1 = a*x1*x1+b*x1+c; double dis = (x1-x)*(x1-x)+(y1-y)*(y1-y); return dis; } }