1 条题解

  • 0
    @ 2026-4-15 19:13:29

    D. 猫头鹰塞拉芬 详细题解

    题目核心理解

    nn 个人排队,基里尔排在最后。 他可以向前插队:

    • 若从位置 ii 跳到位置 j(j<i)j(j<i),需要支付 aja_jjj 号人;
    • 对中间每一个人 k(j<k<i)k(j<k<i),需要支付 bkb_k
    • 要求最终排进mm 个位置; 求最小花费

    核心思路

    1. 关键贪心观察

    • 对于每个位置 ii,只有两种代价:aia_ibib_i
    • 只要 ai<bia_i < b_i,在这里直接用 aia_i 一定更优,相当于一步跳到这里。
    • 否则只能一路付 bib_i 过去。
    • 大于 mm 的位置都必须经过,我们从后往前贪心选最小代价。
    • 最后在前 mm 个位置里选一个终点,加上对应 afa_f 取最小总代价。

    2. 步骤拆解

    1. nn 倒序遍历到 m+1m+1
      • ai<bia_i < b_i:选 aia_i,累加代价。
      • 否则:选 bib_i,累加代价。
    2. 遍历结束后,剩下只需要在前 mm 个位置选一个终点 ff
    3. 总代价 = 已累加代价 + afa_f,取最小值即为答案。

    算法流程

    1. 读入 n,mn, m,数组 a,ba, b
    2. i=ni = ni=m+1i = m+1 逆序遍历:
      • sum += min(a[i], b[i])
    3. 枚举 i=1i = 1i=mi = m
      • ans = min(ans, sum + a[i])
    4. 输出 ansans

    公式与复杂度分析

    最终答案表达式:

    $$ans = \min_{1\le f\le m}\left( \sum_{i=m+1}^n \min(a_i,b_i) \;+\; a_f \right) $$

    复杂度

    • 遍历数组两次,均为线性。
    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(n)O(n) 可轻松通过 n2×105n \le 2\times 10^5、多组数据总和限制。
    • 1

    信息

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