题目
https://www.lanqiao.cn/problems/196/learning/
思路
- 所有操作都是在数组内进行的,整个数组的和不变;
- 每次操作的三个数的和不变,因此考虑到用前缀和。
- 一次更新后,
s[i-1]
变为原来的s[i]
,s[i]
变为原来的s[i-1]
,s[i+1]
不变; - 因此“一次加减操作”转变为“前两个前缀和的交换”。
- 两端的武士不向外传递灵能,但他们的灵能值也会改变,而
s[n]
是所有的和,不变。因此,s[0]=0
,s[1]
到s[n-1]
可以交换到任意位置。 - 要求的东西就变成了求
max{|s[i]-s[i-1|}
尽量小。 - 先考虑简单情况,
s[]
都是正的,将他排序,相邻差最大的就是结果,因为如果不排序,相邻相减会大; - https://blog.csdn.net/xuxiaobo1234/article/details/108095193
- 最后一步,我只能理解成:小于
s[0]
大于min部分的值要排列起来,使得相邻两数的差最大值最小化,从图像上想象就是,s[0]
固定住,s[1]
到s[p]
(假设是这样的下标)升序排序,但都小于s[0]
,然后隔一个的将数拆开成两部分,一部分降序地排列在s[0]
后面,然后另一部分更在后面,这样能“使得相邻两数的差最大值最小化”。
代码
1 | # 灵能传输 |