1 条题解

  • 0
    @ 2025-11-21 0:41:56

    问题本质

    在环形路径上找到起点,使得机器人以最小初始灵活度 aa 能完成一圈,每次跳跃后灵活度 +1+1

    核心思路

    关键转化

    从起点 ss 开始,第 jj 次跳跃需要满足:

    a+jd(s+j)modna + j \ge d_{(s+j) \bmod n}

    即:

    ad(s+j)modnja \ge d_{(s+j) \bmod n} - j

    因此对于起点 ss,最小初始灵活度为:

    as=max0j<n(d(s+j)modnj)a_s = \max_{0 \le j < n} (d_{(s+j) \bmod n} - j)

    目标:找到使 asa_s 最小的 ss

    算法步骤

    1. 生成距离数组 d[0..n1]d[0..n-1]

      • f=1f=1:直接读入
      • f=2f=2:按递推公式生成
    2. 构造需求数组

      • need[i]=d[i]ineed[i] = d[i] - ii=0i = 0n1n-1
      • 复制:need[n+i]=need[i]need[n+i] = need[i](处理环形)
    3. 滑动窗口求最大值

      • 使用单调队列维护长度为 nn 的窗口
      • 对每个起点 iimax_needmax\_need = 窗口内最大值
      • ai=max_need+ia_i = max\_need + i
    4. 选择最优解

      • 找到最小的 aia_i 及对应的 s=i+1s = i+1

    复杂度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(n)O(n)

    实现要点

    • 使用双端队列实现单调队列
    • 注意索引从0还是1开始
    • 模运算处理环形

    这种解法将环形问题转化为线性问题,利用滑动窗口高效求解。

    • 1

    信息

    ID
    5529
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者