时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

这一次我们就简单一点了,题目在此:

hihocoder #1142 : 三分·三分求极值_#include

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

 

输入

第1行:5个整数a,b,c,x,y。前三个数构成抛物线的参数,后两个数x,y表示P点坐标。-200≤a,b,c,x,y≤200

输出

第1行:1个实数d,保留3位小数(四舍五入)

 

 

题解:

三分法板子题,我们可以明显看出P(x,y)到抛物线距离是个凸函数,所以存在极值

 

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #define RG register
 8 #define il inline
 9 using namespace std;
10 const double eps=1e-5;
11 double a,b,c,x,y;
12 double f(double i){
13     double j=a*i*i+b*i+c;
14     return sqrt((x-i)*(x-i)+(y-j)*(y-j));
15 }
16 void work()
17 {
18     double l=-10000.0,r=10000.0,lmid,rmid;
19     while(l<r-eps){
20         lmid=l+(r-l)/3;rmid=r-(r-l)/3;
21         if(f(lmid)<f(rmid))r=rmid;
22         else l=lmid;
23     }
24     printf("%.3lf\n",f(l));
25 }
26 
27 int main()
28 {
29     while(cin>>a>>b>>c>>x>>y)
30     work();
31     return 0;
32 }