提交
2026-06-11 13:04:33
发布于:广东
一、先完整重述题目硬性规则(逐条卡死)
能源核心固定在坐标 0,自带供电,不算新增中继器;它供电半径 30m,覆盖区间 [0, 30]。
额外手动放置的中继器两条限制:
相邻两个中继器之间距离不能超过 80 米(通讯上限);
每个中继器自身供电半径 30m,坐标p的中继器覆盖 [p-30, p+30]。
目标:所有给出的设施坐标都被任意一个中继器供电覆盖,求最少新增中继器数量。
二、贪心核心思想(为什么贪心能得到最小值)
区间覆盖经典贪心模型:
遇到第一个没被覆盖的设施时,新中继器尽可能往右侧摆放。摆放越靠右,往后能覆盖更多后续设施,新增中继器总数必然最少。
但摆放位置有上限约束:
新中继器最远只能放在「上一个中继器位置 + 80」,不能再往右(否则通讯断开)。
摆放位置分两种情况:
想包住当前未覆盖设施,最优摆放位置是 当前设施坐标+30(这个位置刚好能把该设施卡在左边界,中继器往右覆盖最远);
如果这个理想位置超过了通讯上限(上一个 + 80),就只能妥协,放在通讯最远允许位置:上一个中继器+80。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a.begin(), a.end());
int res = 0;
// 上一个中继器的坐标,初始能源核心在0
int last_p = 0;
// 当前最远能覆盖到的位置
int cover = last_p + 30;
int idx = 0;
while (idx < n)
{
// 当前点已经被覆盖
if (a[idx] <= cover)
{
idx++;
continue;
}
// 必须新增中继器
// 受两个限制:
// 1. 最多离上一个中继器80米:max_p = last_p + 80
int max_place = last_p + 80;
// 最优摆放位置:刚好能罩住a[idx],放在a[idx]+30
int new_p = a[idx] + 30;
// 不能超过最大允许摆放位置
if (new_p > max_place)
{
new_p = max_place;
}
res++;
last_p = new_p;
cover = new_p + 30;
}
cout << res << endl;
return 0;
}
关键两句解释
new_p = a[idx] + 30
中继器放在这个点,当前设施 a[idx] 正好在中继器左供电边界(new_p-30 = a[idx]),中继器向右延伸 30 米,最大化覆盖后续设施。
max_place = last_p + 80
中继器之间通讯不能超 80m,这是硬红线,理想位置再靠右也不能超过它。
五、样例 1 手动推演复盘
输入设施:[20,150,170,200,500]
初始:last_p=0,cover=30,idx=0,res=0
a[0]=20 ≤30 → idx=1
a[1]=150>30,必须新增
max_place=80,new_p=180>80 → new_p=80
res=1,last_p=80,cover=110
150>110,再新增
max_place=160,new_p=180>160 → new_p=160
res=2,cover=190
150、170 都≤190 → idx=3(a [3]=200)
200>190,新增
max_place=240,new_p=230≤240 → new_p=230
res=3,cover=260
200≤260 → idx=4(a[4]=500)
500>260,连续新增 3 次中继器,res 累加到 6,cover≥500,全部覆盖。
最终输出 6,和样例一致。
六、之前错误在哪?
最初代码无脑固定每次 last_p +=80,没有判断「能不能把中继器往右边多放一点」。
虽然样例碰巧数值对上,但属于巧合:
遇到设施离上限很近时,会多放无用中继器;
遇到设施稀疏分布场景,算法计数会偏大,通用性完全失效。
修正后的代码严格同时遵守「供电半径 30m」「中继间距≤80m」两条约束,是标准区间覆盖贪心模板,所有边界场景都不会出错。
七、边界测试小例子
测试点:单个设施坐标 35
初始 cover=30,35 超出;
max_place=80,new_p=35+30=65;
new_p=65≤80,放置;res=1;
cover=65+30=95,覆盖 35;
答案正确:需要 1 个中继器。



这里空空如也







有帮助,赞一个