1 条题解
-
0
题解
思路推导
一次操作保留所选位置,并让它吸收左右两个位置的值。追踪各个原始数最终是否被计入,可以得到:最后留下的值等于从圆环某个位置开始、每次向前跨两个位置,连续选取 个数之和。反过来,每个这样的选择都可以按相反顺序完成操作,因此只需在这些候选和中取最大值。
由于 为奇数,不断把下标增加 会恰好遍历所有位置。把这种遍历顺序写成一个长度为 的环状序列,问题就变成求其中长度为 的最大环形连续段和。
做法
先计算从位置 开始、每次跨两个位置得到的前 个数之和。随后把起点沿圆环前移两个位置:删除旧窗口的第一个数,并加入它在遍历顺序中的下一个数。因为 为奇数,执行 次后会考察所有可能起点。
正确性证明
每次操作都会删除当前保留位置的两个邻居。将操作过程反向观察,最终值所包含的原始位置在圆环上必然隔一个取一个,共有 个;选定其中的起点后,这个集合唯一确定。按删除顺序反向构造,可以实现每个这样的集合,所以候选集合与所有可达圆环值一一对应。
算法的初始窗口对应一个候选集合。每次沿“下标加二”的遍历顺序滑动一位,恰好删除当前起点并加入下一个尚未包含的位置,因此窗口始终对应一个合法候选集合。由于 与奇数 互质,滑动 次遍历全部起点。取这些窗口和的最大值,便是最大可达圆环值。
复杂度分析
时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1235
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者