poj3069
本文地址:https://www.cnblogs.com/maplefighting/p/9114408.html
题目名称:Saruman's Army
链接:http://poj.org/problem?id=3069
题意:在军队直线上有 n 个点,记为 xi,每个点的影响范围距离为 R ,计算最少需要多少点才能覆盖所有的点
思路:从最左边的点开始考虑,选取在距离 R 以内最远的点,这样就能保证左边的点能覆盖到,而且贪心策略使得点可以最少。剩下的也可以按照同样的方法。对于选取的点距离为 R 之外的第一个点进行相同处理。
代码如下:
1 #include<cstdio>
2 #include<algorithm>
3 using namespace std;
4 int a[1005];
5 int main() {
6 int R,n;
7 while(scanf("%d%d", &R, &n) != EOF) {
8 if(R == -1 && n == -1)
9 break;
10 for(int i = 0; i < n; i++)
11 scanf("%d", &a[i]);
12 sort(a,a + n);
13 int sum = 0, i = 0;
14 while(i < n) {
15 int left = a[i++];
16 while(i < n && a[i] <= left + R) ++i;
17 int middle = a[i - 1];
18 while(i < n && a[i] <= middle + R) ++i;
19 sum++;
20 }
21 printf("%d\n", sum);
22 }
23 return 0;
24 }
本文版权归作者本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.