POJ_3069 Saruman's Army 【贪心】

一、题面

POJ3069

二、题意分析

我的理解是,可以在每个点设置一个监测点,能够监测到范围R内的所有其他点,那么问给出N个点的一维位置,需要在其中挑多少个监测点把所有点都监测到。

贪心解决:

  1.先排序。

  2.考虑第一个点,因为每个点是必须要监测的,那么第一个点需要被监测到,它可以是监测点,也可以是被监测点。贪心的想,为了能监测更多的点,让第一个点作为被监测的点,且是监测范围内最边界上的点。

  3.现在需要考虑,当第一个点往右探测R范围时,最后一个点将是需要设置的监测点。

  4.以这个监测点再往右扫R范围。

  5.完成了一个监测点及其范围内点的覆盖。后面的点类似处理。

三、AC代码

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int MAXN = 1e3;
 8 int Data[MAXN+3], N, R;
 9 
10 int solve()
11 {
12     int i = 0, ans = 0, cur;
13     while(i < N)
14     {
15         cur = Data[i++];
16         while(i < N && Data[i] <= cur+R)
17             i++;
18         cur = Data[i-1];
19         while(i < N && Data[i] <= cur + R)
20             i++;
21         ans++;
22     }
23     return ans;
24 }
25 
26 int main()
27 {
28     freopen("input.txt", "r", stdin);
29     while(scanf("%d %d", &R, &N) != EOF && R != -1)
30     {
31         for(int i = 0; i < N; i++)
32             scanf("%d", &Data[i]);
33         sort(Data, Data+N);
34         printf("%d
", solve() );
35     }
36     return 0;
37 }
View Code
原文地址:https://www.cnblogs.com/dybala21/p/10105670.html