思路
这题开始和重力坠击这题搞混了,后来发现,这个圆心只能在x轴上,开始以为全图点都能当圆心,人傻了 。
那么这题数据范围就
[
−
100
,
100
]
[-100,100]
[−100,100],纯暴力就行了,具体步骤,每次找到一个圆心坐标能涵盖最多的点,然后标记这些点,用vector存储每个圆心能涵盖的点,然后用size比较大小即可,当所有点都被包含那么就退出循环。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
typedef pair<int,int> PII;
PII e[110];
int t,n,r;
int st[110];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&r);
for(int i=1;i<=n;i++)
{
cin>>e[i].first>>e[i].second;
st[i]=0;
}
int ans=0,res=0;
while(1)
{
res++;
vector<int> v[210];
for(int i=1;i<=n;i++)
{
if(st[i]) continue;
for(int j=-100;j<=100;j++)
{
int temp;
if(j<0)
{
temp=abs(j)+100;
}
else
{
temp=j;
}
if((e[i].first-j)*(e[i].first-j)+e[i].second*e[i].second<=r*r)
{
v[temp].push_back(i);
}
}
}
int sum=0,pos=0;
for(int i=0;i<=200;i++)
{
if(v[i].size()>sum)
{
sum=v[i].size();
pos=i;
}
}
ans+=sum;
for(int i=0;i<sum;i++)
{
st[v[pos][i]]=1;
}
if(ans==n)
break;
}
printf("%d\n",res);
}
return 0;
}