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;
    }
}

 

posted @ 2018-11-24 19:33  给我一个团队,干翻TX  阅读(170)  评论(0编辑  收藏  举报