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 }
康复训练中~欢迎交流!