hdu 3069(贪心)

点击打开链接


题意:

x轴上有n点,每个点都有一个覆盖距离m,求最少需要多少个点可以把所有的点覆盖。。。


这里主要是要找以那个点为中心。

比如1 7 15 20 30 50 70(m=10)

刚开始用1为中心,它的覆盖距离为1-11,因为7在范围内,所以可以以7为中心,以7为中心,可以把15覆盖。ans++;

然后再以20为中心,可以找到30在20的范围内,所以更新中心点为30,然后去掉30-40范围内的点,ans++;

依此类推。。。。

综上,每次现以一个点a为中心,然后看看能否更新中心(即是否有某个点在a的距离内),然后去掉新的中心里面的点。。。


#include"stdio.h"
#include"string.h"
#include"algorithm"
using namespace std;
#define N 1005
int main()
{
	int i;
	int n,m;
	int A[N];
	while(scanf("%d%d",&m,&n)!=-1)
	{
		if(m==-1&&n==-1)break;
		for(i=0;i<n;i++)
			scanf("%d",&A[i]);
		sort(A,A+n);
		int ans=1;
		int p=A[0]+m;
		i=1;
		while(i<n)
		{
			while(i<n&&A[i]<=p)i++;
			if(i>=n)break;
			p=A[i-1]+m;
			while(i<n&&A[i]<=p)i++;
			if(i>=n)break;
			p=A[i]+m;
			ans++;
		}
		printf("%d\n",ans);
	}
	return 0;
}





你可能感兴趣的:(dp,poj)