题目摘自《挑战程序设计竞赛(第二版)》2.2.4.1 P45
(好久没用.md格式写东西了
题意:
- 直线上有
N
个点,点
这个题贪心思路挺裸的。从最左边的点开始,标记距离为R以内的最远点。
即当前最左的点
X
,标记比
因为其他方案都不是最优的方案,所以这个算法是正确的。
题目所给
N<=1000
,所附代码时间复杂度为
O(nlogn)
,完全能在规定时间内通过。
代码如下↓
#include <cstdio>
#include <algorithm>
using namespace std;
int r, n, x[1111], locate, ans, Max;
int main() {
while (1) {
ans = 0;
Max = -2147483;
scanf("%d%d", &r, &n);
if (r == -1 && n == -1)
break;
for (int i = 1; i <= n; i++) {
scanf("%d", &x[i]);
Max = Max < x[i] ? x[i] : Max;
}
sort(x + 1, x + 1 + n);
locate = 1;
while (locate <= n) {
int s = x[locate++];
while (x[locate] <= s + r && locate <= n)
locate++;
int p = x[locate - 1];
while (x[locate] - p <= r && locate <= n)
locate++;
ans++;
}
printf("%d\n", ans);
}
}