题意:给你一百个点,找个以这些点为中心的最小的圆,使得这个圆恰好包含了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 "); 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 ",ans); 57 } 58 return 0; 59 }