hicoder1142 三分求极值

在直角坐标系中有一条抛物线y=ax^2+bx+c和一个点P(x,y),求点P到抛物线的最短距离d。

 

我们代入公式,有:

$d = min(\sqrt{(X - x)^2+(aX^2+bX+c-y)^2})$

由题面不难发现它是个下凸函数,于是就可以跑三分了

#include<bits/stdc++.h>
using namespace std;
const double esp=1e-6;
double a,b,c,x,y;
double dis(double px){
    double py=a*px*px+b*px+c;
    return sqrt((x-px)*(x-px)+(y-py)*(y-py));
}
int main(){
    scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&x,&y);
    double l=-200.0,r=200.0;
    while(l+esp<r){
        double lmid=l+(r-l)/3,rmid=r-(r-l)/3;
        if(dis(lmid)<dis(rmid))r=rmid;
        else l=lmid;
    }
    printf("%.3lf",dis(l));
    return 0;
} 

 

posted @ 2017-10-25 15:32  NINGLONG  阅读(139)  评论(0编辑  收藏  举报