第1题-最小化峰值干扰
小红书9月10日机考题目与解析
要将 项探测任务按给定顺序安排到连续 个时隙。第 个时隙的干扰强度为 ,第 项任务占用连续 个时隙。记 为第 项任务的起始时隙,则其占用区间为 。
安排须满足:
- 任务占用互不重叠:对任意 ,有 ;任务之间可空出任意个时隙。
- 任务保持给定顺序:。
- 均落在时隙范围内: 且 。
峰值干扰为
求所有合法安排下峰值干扰的最小值。
输入描述
第一行一个正整数 ,表示测试数据组数。
对于每组测试数据: 第一行两个正整数 ,表示时隙数和任务数; 第二行 个正整数 ,表示每个时隙的干扰强度; 第三行 个正整数 ,表示每项任务占用的时隙数。
输出描述
对于每组测试数据,输出一行一个整数,表示峰值干扰的最小值。
数据范围:,所有测试数据的 之和 ,,,,。
样例 1
输入:
2
7 2
8 1 3 5 2 1 4
2 3
6 3
2 8 1 1 3 1
1 1 2输出:
4
3说明: - 第一组:第一项任务放在 (覆盖 ,最大值 ),第二项放在 (覆盖 ,最大值 ),峰值 。若要求峰值不超过 ,则时隙 、、 不可用,剩余连续段长度不足以放下长度为 的第二项任务。 - 第二组:三项任务分别放在时隙 、 与 (覆盖 ;;),峰值 。若要求峰值不超过 ,则时隙 、 不可用,无法为第三项任务找到长度为 的连续段。
思路
二分答案 + 贪心验证。「峰值干扰的最小值」满足单调性:上限 越大越容易安排。
验证 fun(x):干扰
的时隙视为可用,任务必须整段放进同一个连续可用段且保持顺序。顺序扫描:累计当前连续可用长度
last,凑够
就放置并清零;扫描结束前放完全部
项则可行。注意不可用时隙会把连续段打断(last 清零)。
在 上二分最小可行 ,验证 ,总复杂度 。
代码
t = int(input())
def solve():
n, m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
def fun(x):
bi = 0 # 当前要放的任务
last = 0 # 当前连续可用段长度
for i in range(n):
if a[i] <= x:
last += 1
if last == b[bi]:
last = 0
bi += 1
if bi == m:
return True
else:
last = 0
return False
lo, hi = min(a), max(a) + 1
while lo < hi:
mid = lo + (hi - lo) // 2
if fun(mid):
hi = mid
else:
lo = mid + 1
print(lo)
for _ in range(t):
solve()第1题-最小化峰值干扰
https://mingsm17518.github.io/2026/11/03/刷题笔记/机考/小红书/2026年9月10日/第1题-最小化峰值干扰/