poj 3069 Saruman's Army

题意:

在一条线上,有若干个点,在每个点的r范围内必须有一个被标记的点,问最少标记多少个点。

思路:

贪心,在一个未标记点向右找一个远的点为标记点,再在这个点的基础上找一个最近的不能被标记的点,就是下一个需要处理的点。

坑:

有lower_bound比较难写Orz。

代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <iostream>
 4 using namespace std;
 5 
 6 int x[1005];
 7 
 8 int main()
 9 {
10     int r,n;
11 
12     while (scanf("%d%d",&r,&n))
13     {
14         if (r == -1 && n == -1) break;
15 
16         for (int i = 0;i < n;i++)
17             scanf("%d",&x[i]);
18 
19         sort(x,x+n);
20 
21         n = unique(x,x+n) - x;
22 
23         int ans = 0;
24 
25         int i = 0;
26 
27         while (i < n)
28         {
29             int cur = x[i];
30 
31             while (i < n && cur + r >= x[i]) i++;
32 
33             ans++;
34 
35             cur = x[i-1];
36 
37             while (i < n && cur + r >= x[i]) i++;
38         }
39 
40         //for (int i = 0;i < n;i++) printf("%d ",x[i]);
41 
42         printf("%d\n",ans);
43     }
44 
45     return 0;
46 }

 

posted @ 2017-12-12 12:29  qrfkickit  阅读(122)  评论(0编辑  收藏  举报