为了追踪他的部队,萨鲁曼在部队中分发被称为帕兰提尔的可见石。每个帕兰提尔都有一个最大有效射程的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;
}