1. 程式人生 > >HihoCoder - 1142 ,三分入門

HihoCoder - 1142 ,三分入門

先來說說三分的思想:

從三分法的名字中我們可以猜到,三分法是對於需要逼近的區間做三等分:

我們發現lm這個點比rm要低,那麼我們要找的最小點一定在[left,rm]之間。如果最低點在[rm,right]之間,就會出現在rm左右都有比他低的點,這顯然是不可能的。

同理,當rm比lm低時,最低點一定在[lm,right]的區間內。 利用這個性質,我們就可以在縮小區間的同時向目標點逼近,從而得到極值。 

 

HihoCoder - 1142 

題目如下:

在直角座標系中有一條拋物線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; } }