poj原题:
大致题意
给定多组数据,每组数据中有一个范围x,及n个点及数轴坐标,
请标记某几个点,使得每个点在距离其x内有至少1个被标记的点。
问最少标记几个点可以满足上面的要求。
思路
所以很显然,这是一道(shui shui de)贪心。
第一先排序,这样就是按数轴从左到右的顺序排序。
我们要确定每一个点在标记点的“辐射”范围内。
那么先确保最左边一个a在标记点辐射范围内。
也就是说被第一个被标记的点一定在a+x内;
并且为了最优性,一定是a+x内最大的一个点被标记;
寻找到这个被标记的点后,我们要确定它最多可以覆盖多少个点,
于是继续向右寻找在a+2x内的点直到找到一点无法被覆盖;
那么这个点就是下一个a点,重复上述步骤,直至找遍所有的点。
贴代码=。=
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[1000],n,m,x,ans;
int main()
{
freopen("in.txt","r",stdin);
while(1)
{
memset(a,0,sizeof(a));
scanf("%d%d",&m,&n);
if(n==-1&&m==-1)break;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
ans=0;
for(int i=1;i<=n;i++)
{
ans++;
x=a[i]+m;
while(a[i+1]<=x)i++;
x=a[i]+m;
while(a[i+1]<=x)i++;
}
printf("%d\n",ans);
}
}