HihoCoder - 1142 ,三分入门

时间:2023-03-09 03:12:16
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;
}
}