POJ3069Saruman's Army

贪心好题

大体思路是按照右端点排序,每次选最靠前的没有被覆盖的区间的右端点放一个点,自己画画图就会发现非常有道理

代码

//By AcerMo
#include<cmath> 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=1500;
int n,m;
int x[M],jud[M];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
signed main()
{
	while (cin>>m>>n&&m!=-1&&n!=-1)
	{
		int ans=0;
		for (int i=1;i<=n;i++) x[i]=read();
		sort(x+1,x+n+1);
		for (int i=1;i<=n;i++)
		{
			int e=i+1;ans++;
			while (e<=n&&x[e]<=x[i]+m) e++;
			int emm=x[e-1];
			while (e<=n&&x[e]<=emm+m) e++;
			i=e-1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81362454