1 条题解

  • 0
    @ 2026-9-3 10:33:31

    题解

    思路推导

    一次操作保留所选位置,并让它吸收左右两个位置的值。追踪各个原始数最终是否被计入,可以得到:最后留下的值等于从圆环某个位置开始、每次向前跨两个位置,连续选取 (n+1)/2(n+1)/2 个数之和。反过来,每个这样的选择都可以按相反顺序完成操作,因此只需在这些候选和中取最大值。

    由于 nn 为奇数,不断把下标增加 22 会恰好遍历所有位置。把这种遍历顺序写成一个长度为 nn 的环状序列,问题就变成求其中长度为 (n+1)/2(n+1)/2 的最大环形连续段和。

    做法

    先计算从位置 11 开始、每次跨两个位置得到的前 (n+1)/2(n+1)/2 个数之和。随后把起点沿圆环前移两个位置:删除旧窗口的第一个数,并加入它在遍历顺序中的下一个数。因为 nn 为奇数,执行 nn 次后会考察所有可能起点。

    正确性证明

    每次操作都会删除当前保留位置的两个邻居。将操作过程反向观察,最终值所包含的原始位置在圆环上必然隔一个取一个,共有 (n+1)/2(n+1)/2 个;选定其中的起点后,这个集合唯一确定。按删除顺序反向构造,可以实现每个这样的集合,所以候选集合与所有可达圆环值一一对应。

    算法的初始窗口对应一个候选集合。每次沿“下标加二”的遍历顺序滑动一位,恰好删除当前起点并加入下一个尚未包含的位置,因此窗口始终对应一个合法候选集合。由于 22 与奇数 nn 互质,滑动 nn 次遍历全部起点。取这些窗口和的最大值,便是最大可达圆环值。

    复杂度分析

    时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。

    • 1

    信息

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