2015北京网络赛A题The Cats' Feeding Spots

题意:给你一百个点,找个以这些点为中心的最小的圆,使得这个圆恰好包含了n个点,而且这个圆的边界上并没有点

解题思路:暴力枚举每个点,求出每个点到其他点的距离,取第n大的点,判断一下。

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<memory.h>
 6 using namespace std;
 7 const int MAXN=1000;
 8 const double eps=1e-8;
 9 const int inf=0x3f3f3f3f;
10 
11 struct point
12 {
13     double x,y;
14 }node[110];
15 
16 int n,m,T;
17 double d[110][110];
18 
19 double dis(point a,point b)
20 {
21     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
22 }
23 
24 int main()
25 {
26     scanf("%d",&T);
27     while(T--)
28     {
29         scanf("%d%d",&m,&n);
30         memset(d,0,sizeof(d));
31         for(int i=0;i<m;i++)
32         {
33             scanf("%lf%lf",&node[i].x,&node[i].y);
34         }
35         if(n>m)
36         {
37             printf("-1\n");
38             continue;
39         }
40         int ans=inf;
41         for(int i=0;i<m;i++)
42         {
43             for(int j=0;j<m;j++)
44             {
45                 d[i][j]=dis(node[i],node[j]);
46             }
47         }
48         for(int i=0;i<m;i++)
49         {
50             sort(d[i],d[i]+m);
51             int p=(int)ceil(d[i][n-1]+eps);
52             if(d[i][n]-p>eps||n==m)
53                 ans=min(ans,p);
54         }
55         if(ans==inf) ans=-1;
56         printf("%d\n",ans);
57     }
58     return 0;
59 }
View Code

 

posted @ 2015-10-04 15:56  yyblues  阅读(244)  评论(0编辑  收藏  举报