用c++完成这道题,不用写注释:题目描述 华罗庚大道在国庆时准备举办庆祝活动,为了确保活动的顺利举行,AA市的相关部门要在该条道路上设置安保人员。 该大道可以看作一条坐标从 00 到 1000010000 的线段,该线段上有 nn 个点可以设置安保人员,每个点的安保人员负责安保的范围是为区域半径为 rr 的区间,也就是说,位于坐标值为 xx 的位置的安保人员,将会负责 [x-r,x+r][x−r,x+r] 的区域。 请问,这 nn 个点至少要选择几个点设置安保人员,才能使得整条大道的所有位置都有安保人员负责? 输入 第一行两个整数 nn 和 rr(n≤1000n≤1000,r≤20000r≤20000)。分别表示可设置安保人员的位置数量和安保人员可以负责的区域半径。 第二行 nn 个数,分别表示可设置安保人员的点的坐标。 输出 一个数,表示最少需要选择设置安保人员的位置数量。(本题测试数据确保有解)
时间: 2024-02-16 10:59:43 浏览: 86
82道华为校招历年机试编程题C++代码附详细注释.pdf
5星 · 资源好评率100%
以下是C++代码,实现了对该问题的求解:
```c++
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 1010;
int n, r;
int a[MAXN];
int main()
{
cin >> n >> r;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
int ans = 0;
int p = 0;
while(p < n)
{
int s = a[p++];
while(p < n && a[p] <= s + r) p++;
int t = a[p - 1];
while(p < n && a[p] <= t + r) p++;
ans++;
}
cout << ans << endl;
return 0;
}
```
代码思路:
首先将所有可设置安保人员的点按照坐标从小到大排序,之后从左向右扫描数组,对于每一个点,我们需要尽可能向右覆盖范围,选择下一个点,直到不能再向右覆盖为止。此时,我们需要选择下一个未被覆盖的点,然后再次覆盖向右的范围。这个过程一直进行下去,直到最后一个点被覆盖。在这个过程中,我们选择的点数就是最少需要设置的安保人员数量。
时间复杂度为 $O(n \log n)$。
阅读全文