点击打开链接
#include < iostream >
#include < cstdio >
#define inf 0x3f3f3f
#define exp 10e-6
using namespace std;
struct point
{
double x,y;
}p[10005];
double Min(double a,double b)
{
return a>b?b:a;
}
double xie(point b,point a)
{
return (a.y-b.y)/(a.x-b.x);
}
double dis(double x,double k,double n)
{
double s;
s=n/(x*x)+k*x;
return s;
}
/* 思路:要求组合函数的最少值,即分段求取
采用二分的方案,求取每个区间的最少值取min */
int main ()
{
//freopen("t.txt","r",stdin);
int i,m,n;
double k,l,r,mid,miid,d;
while(scanf("%d%d",&m,&n)!=EOF)
{
for(d=inf,i=0 ; i<m ; i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(i=1 ; i<m ; i++)
{
double s1 , s2;
k=xie(p[i-1] , p[i]);
l=p[i-1].x; r=p[i].x;
while(r-l>exp)
{
mid=(l+r)/2;
miid=(mid+r)/2;
s1=dis(mid,k,n);
s2=dis(miid,k,n);
if(s1>s2) l=mid;
else r=miid;
}
s2+=(p[i-1].y-k*p[i-1].x);
d=Min(d,s2);
}
printf("%.3lf\n",d);
}
return 0;
}