码迷,mamicode.com
首页 > 其他好文 > 详细

三分 例题

时间:2015-08-01 11:11:29      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

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\n",C(xub));
58     }
59     return 0;
60 }
View Code

 

三分 例题

标签:

原文地址:http://www.cnblogs.com/cyd308/p/4693667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!