题目:
Saruman's Army - POJ 3069 - Virtual Judge
分析:
双指针,i 指针将排好序的数组遍历,j 指针类似于二分查找边界。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 1010;
int r, n;
int a[N];
int main()
{
while (scanf("%d%d", &r, &n))
{
if (r == -1 && n == -1) break;
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
sort (a, a + n);
int i = 0, ans = 0;
while (i < n)
{
int flag = a[i] + r, j = i;
// 中心点
while (j < n)
{
if (a[j] <= flag) j ++ ;
else
{
flag = a[-- j] + r;
break;
}
}
// 右边界
while (j < n)
{
if (a[j] <= flag) j ++ ;
else break;
}
ans ++ ;
i = j;
}
cout << ans << endl;
}
return 0;
}