HihoCoder - 1142 ,三分入門
阿新 • • 發佈:2018-11-24
先來說說三分的思想:
從三分法的名字中我們可以猜到,三分法是對於需要逼近的區間做三等分:
我們發現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; } }