1 条题解

  • 0
    @ 2025-10-23 20:46:17

    问题转化

    本题可以转化为一个流量调度问题:我们需要将各楼层的初始人数 aia_i 调整为目标人数 bib_i,通过相邻楼层之间的楼梯移动人员。每个楼梯单位时间只能单向通过一人。

    ci=aibic_i = a_i - b_i,表示第 ii 层需要净流出的人数(若 ci>0c_i > 0 则需要向上或向下输出人员,若 ci<0c_i < 0 则需要输入人员)。

    关键观察

    1. 前缀和性质:定义 Sk=i=1kciS_k = \sum_{i=1}^k c_i,表示前 kk 层净需求人数。由于总人数守恒,Sn=0S_n = 0

    2. 时间下界:最少需要的时间等于所有前缀和绝对值的最大值:

      T=max1knSkT = \max_{1 \le k \le n} |S_k|

      这个结论的直观理解是:Sk|S_k| 表示前 kk 层与后 nkn-k 层之间需要交换的人数,这些交换必须通过第 kk 层与第 k+1k+1 层之间的楼梯完成。

    算法思路

    1. 计算差值数组 ci=aibic_i = a_i - b_i
    2. 计算前缀和 Sk=i=1kciS_k = \sum_{i=1}^k c_i
    3. 答案即为 maxSk\max |S_k|

    时间复杂度O(n)O(n),满足 n106n \le 10^6 的要求。

    正确性证明

    考虑任意相邻两层 iii+1i+1 之间的楼梯:

    • 如果 Si>0S_i > 0,表示前 ii 层人数过剩,需要向第 i+1i+1 层及以后输送 SiS_i
    • 如果 Si<0S_i < 0,表示前 ii 层人数不足,需要从第 i+1i+1 层及以前接收 Si|S_i|

    由于每个楼梯单位时间只能单向通过一人,所以至少需要 Si|S_i| 个单位时间来完成这些人员的流动。对所有 ii 取最大值即得到总时间下界。

    样例验证

    对于样例:

    n = 3
    a = [1, 0, 1]  
    b = [0, 2, 0]
    c = [1, -2, 1]
    S = [1, -1, 0]
    max|S| = 1
    

    答案为 1,符合样例输出。

    • 1

    信息

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