一、题面
二、题意分析
我的理解是,可以在每个点设置一个监测点,能够监测到范围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 }