标签:
Description
给出平面上N(<=100)个点,你需要找到一个这样的点,使得这个点到N个点的距离之和尽可能小。输出这个最小的距离和(四舍五入到最近的整数)。
Input
第一行N,接下来N行每行两个整数,表示N个点
Output
一行一个正整数,最小的距离和。
Sample Input
4 0 0 0 10000 10000 10000 10000 0
Sample Output
28284
1 #include <stdio.h> 2 #include <math.h> 3 const double inf=1e9+7; 4 5 int n; 6 double a[105],b[105]; 7 8 double Cal(double x,double y) 9 { 10 int i; double s=0; 11 for(i=1;i<=n;i++) 12 { 13 s=s+sqrt((x-a[i])*(x-a[i])+(y-b[i])*(y-b[i])); 14 } 15 return s; 16 } 17 18 double C(double x) 19 { 20 int i; double l=-inf,u=inf,m,mm; 21 for(i=1;i<=100;i++) 22 { 23 m=(l+u)/2.0; 24 mm=(m+u)/2.0; 25 if(Cal(x,m)<=Cal(x,mm)) 26 { 27 u=mm; 28 } 29 else 30 { 31 l=m; 32 } 33 } 34 return Cal(x,u); 35 } 36 37 int main() 38 { 39 int i,j; 40 while(scanf("%d",&n)!=EOF) 41 { 42 for(i=1;i<=n;i++) 43 scanf("%lf %lf",&a[i],&b[i]); 44 double xlb=-inf,xub=inf; 45 for(i=1;i<=100;i++) 46 { 47 double xmid=(xlb+xub)/2.0,mxmid=(xmid+xub)/2.0; 48 if(C(xmid)<=C(mxmid)) 49 { 50 xub=mxmid; 51 } 52 else 53 { 54 xlb=xmid; 55 } 56 } 57 printf("%.lf\n",C(xub)); 58 } 59 return 0; 60 }
标签:
原文地址:http://www.cnblogs.com/cyd308/p/4693667.html