http://poj.org/problem?id=3069
题目大意:给定n个数的序列和一个R(代码里我写的m),从中中选定最少的数,使这几个数周围R的能包含序列的所有数。
先排个序,然后一次跳2*m,跳到两个数中间就取前面的那个,如此贪心即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,m,a[1010];
int main()
{
while(scanf("%d%d",&m,&n)&&n!=-1)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int i=1,j,t,num=0;
while(i<=n)
{
t=a[i]+m;
for(j=i;a[j]<=t&&j<=n;j++);
j--;
i=j;
t=a[i]+m;
for(j=i;a[j]<=t&&j<=n;j++);
i=j;
num++;
}
printf("%d\n",num);
}
return 0;
}