首页 > 试题广场 >

火星探测器稳定性分析

[编程题]火星探测器稳定性分析
  • 热度指数:3150 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
“祝融号”火星探测器在火星表面执行一项精密科学探测任务。其搭载的科学仪器对工作环境的稳定性有非常严苛的要求。为了保证仪器的正常运行和数据的准确性,必须满足以下两个条件:

1. 仪器的“环境稳定性指数” S 必须维持在 [18, 24] 的区间内,即 18 \le S \le 24
2. 在任何一次连续的工作期间内,环境稳定性指数的最大波动范围(即该期间的 S_{max} - S_{min})不得超过 4,即 S_{max} - S_{min} \le 4

现在,探测器沿一条预定路线行进,并按固定时间间隔连续采集了 N 次环境稳定性指数。这些数据按采集顺序(索引从 0 开始)记录下来。

为了最大化单次有效工作时长,请你找出满足上述两个稳定条件的、持续时间最长的一个或多个时间段。请输出这些时间段的起始和结束索引。如果存在多个长度相同的最长时间段,请按照起始索引从小到大的顺序,逐行输出。


输入描述:
第一行为连续采集的次数 N,其中 N 的取值范围为 [1, 10^5]
第二行为 N 个按顺序采集的环境稳定性指数,均为整数,数值范围为 [0, 30]。数值之间以空格分隔。


输出描述:
输出持续时间最长且满足稳定条件的时间段的起始索引和结束索引,两者以空格分隔。如果存在多个这样的时间段,按起始索引升序逐行输出。
示例1

输入

20
27 2 19 16 24 9 29 21 28 10 5 27 6 4 27 11 14 1 4 27

输出

2 2
4 4
7 7

备注:
本题由牛友@Charles 整理上传
from collections import deque
N = int(input())
data = list(map(int, input().split()))

# window [left, right]
length = 0
result = []

max_q = deque()
min_q = deque()

for right, S in enumerate(data):
    
    # 可以进窗口
    if 18 <= S and S <= 24:
        # 维护队列进口
        while max_q and data[max_q[-1]] < S:
            max_q.pop()
        max_q.append(right)

        while min_q and data[min_q[-1]] > S:
            min_q.pop()
        min_q.append(right)

        # 维护队列出口
        while max_q and min_q and data[max_q[0]] > data[min_q[0]] + 4:
            if max_q[0] < min_q[0]:
                max_q.popleft()
            elif max_q[0] > min_q[0]:
                min_q.popleft()

        # 收集结果
        if max_q and min_q:
            left = min(max_q[0], min_q[0])
            if right - left + 1 > length:
                length = right - left + 1
                result = [[left, right]]
            elif right - left + 1 == length:
                result.append([left, right])
    # 坏点,重置窗口
    else:
        if right + 1 < N:
            max_q = deque()
            min_q = deque()
            left = right + 1

for each in result:
    print(each[0], each[1])

发表于 2025-10-30 12:23:02 回复(0)