题意:
给出n个点的坐标,每个点有一个半径r,先可以对点染色,要求每个点的覆盖范围内必有一被染色的点。
题解:
首先可以将点转化为区间来看;
发现从最左边的点开始,每次选能覆盖到的最右边的点总是不会差的;
选到那个点之后,再从那个点开始跳到那个点r之外的第一个点;
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int a[1010];
int gi() {
int x=0,o=1; char ch=getchar();
while(ch!='-' && (ch<'0' || ch>'9')) ch=getchar();
if(ch=='-') o=-1,ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return o*x;
}
int main() {
int r,n,ans,i,j,k;
while(~scanf("%d%d", &r, &n) && n!=-1 && r!=-1) {
ans=0;
for(i=1; i<=n; i++) a[i]=gi();
sort(a+1,a+n+1);
for(i=1; i<=n; i++) {
j=i;
while(j+1<=n && a[i]+r>=a[j+1]) j++;
ans++,k=j;
while(a[j]+r>=a[k+1] && k+1<=n) k++;
i=k;
}
printf("%d
", ans);
}
return 0;
}