poj3069

为了追踪他的部队,萨鲁曼在部队中分发被称为帕兰提尔的可见石。每个帕兰提尔都有一个最大有效射程的R单位,必须由军队中的一些部队携带(即,帕兰提尔不允许在半空中“自由漂浮”)。

帮助萨鲁曼控制中土,确定萨鲁曼所需的帕兰提尔的最低数量,以确保他的每一个仆从都在某个帕兰提尔的R单位之内。

输入

输入测试文件将包含多个案例。每个测试用例以一条单行线开始,其中包含整数R,所有palantir的最大有效射程(其中0≤R≤1000)和整数n,即萨鲁曼军队中的部队数量(其中1≤n≤1000)。下一行包含n个整数,指示每个部队的位置x1,…,xn(其中0个小于席1000)。文件的结尾由一个R=n=-1的测试用例标记。

输出

对于每个测试用例,打印一个表示所需最少palantir数的整数。

0 3

10 20 20

10 7

70 30 1 7 15 20 50

-1 -1

思路:贪心问题,需要将点进行排序,但是有重复的要注意,排序后开始找,当找到一个点i大于r后第i-1个点可以做放置石头的中心,在从i-1开始寻找另一半r范围。不断地循环下去,直到i==n-1。

#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
	int r,n,i,j,a[1100];
	while(~scanf("%d %d",&r,&n)&&r!=-1&&n!=-1)
	{
		int ans=0;
		memset(a,0,sizeof(a));
		for (i=0; i<n; i++)
			scanf("%d",&a[i]);
		sort(a,a+n);
		i=0;
		while (i<n)
		{
			int t=a[i];
			i++;

			while (i<n&&a[i]<=t+r) i++;
			int p=a[i-1];
			while (i<n&&a[i]<=p+r) i++;
			ans++;
		}
		printf("%d
",ans);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/shidianshixuan/p/13376242.html