[poj3069] Saruman's Army

题意:

给出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\n", ans);
  }
  return 0;
}
posted @ 2017-10-13 22:53  HLX_Y  阅读(98)  评论(0)    收藏  举报