Description
这个题是说给你n个点,然后让你标记其中尽可能少的点,使得n个点都处于被标记点左右不超过R的区间内
Input
多组用例,每组用例第一行两个整数R和n,第二行n个整数表示n个点的位置,以-1 -1结束输入
Output
对于每组用例,输出标记点的最少数量
Sample Input
0 3
10 20 20
10 7
70 30 1 7 15 20 50
-1 -1
Sample Output
2
4
Solution
先排序,从小到大,以最小的x为中心,找到距离x+r范围内最右的点,再以该点为中心向右,这样找到的是第一个圆圈所能包含的最多的点,以此类推
Code
#include<stdio.h>
int main()
{
int r,n,x[1001],i,j,k,t,count,s,p;
scanf("%d%d",&r,&n);
while(r!=-1&&n!=-1)
{
count=0;
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=0;i<n-1;i++)//对点排序
{
k=i;
for(j=i+1;j<n;j++)
if(x[k]>x[j])
k=j;
if(k!=i)
{
t=x[i];
x[i]=x[k];
x[k]=t;
}
}
i=0;
while(i<n)
{
s=x[i++];
while(i<n&&x[i]<=(s+r))
i++;
p=x[i-1];
while(i<n&&x[i]<=(p+r))
i++;
count++;
}
printf("%d\n",count);
scanf("%d%d",&r,&n);
}
}