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

时间:2021-11-20 11:27:58

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

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

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<memory.h>
using namespace std;
const int MAXN=;
const double eps=1e-;
const int inf=0x3f3f3f3f; struct point
{
double x,y;
}node[]; int n,m,T;
double d[][]; double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
memset(d,,sizeof(d));
for(int i=;i<m;i++)
{
scanf("%lf%lf",&node[i].x,&node[i].y);
}
if(n>m)
{
printf("-1\n");
continue;
}
int ans=inf;
for(int i=;i<m;i++)
{
for(int j=;j<m;j++)
{
d[i][j]=dis(node[i],node[j]);
}
}
for(int i=;i<m;i++)
{
sort(d[i],d[i]+m);
int p=(int)ceil(d[i][n-]+eps);
if(d[i][n]-p>eps||n==m)
ans=min(ans,p);
}
if(ans==inf) ans=-;
printf("%d\n",ans);
}
return ;
}