三分 例题

K - 例题4
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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
",C(xub));
58     }
59     return 0;
60 }
View Code
原文地址:https://www.cnblogs.com/cyd308/p/4693667.html