《疯狂队列》

在这里插入图片描述
在这里插入图片描述

网上看了几篇题解,发现好像很多都是错的……

假如序列是这样: a A b B c C aAbBcC aAbBcC它的疯狂值就是 A − a + A − b + B − b + B − c + C − c A-a+A-b+B-b+B-c+C-c Aa+Ab+Bb+Bc+Cc也就是 2 A + 2 B + C − a − 2 b − 2 c 2A+2B+C-a-2b-2c 2A+2B+Ca2b2c除了C和a之外,都被加或减了两次。

因此,如果序列长度是2n,那么它的最大疯狂值就是二倍的n个较大值的和减去二倍的n个较小值的和,再减去较大值中最小的并加上较小值中最大的。

长度为偶数的序列的答案没有什么争议,即使把序列排列成 A a B b C c AaBbCc AaBbCc,得到的答案也和上文一样。

问题就出在了长度为奇数的序列。

网上的很多答案默认把长度为奇数的序列排列成这样: A a B b C AaBbC AaBbC

但是为什么不能是 a A b B c aAbBc aAbBc

上边两个序列对应的原始数据相同,只是每个字母对应的数字可能不同。

假如序列height长度是2n+1,下标是从0到2n,按照AaBbC的排列方式,答案是A+C+2B-2a-2b,也就是二倍的较大的n+1个数的和减去二倍的较小的n个数的和,再减去较大数中的两个最小数。更普遍的,它可以写作:
a n s 1 = 2 ( ∑ i = n 2 n h e i g h t [ i ] − ∑ i = 0 n − 1 h e i g h t [ i ] ) − h e i g h t [ n ] − h e i g h t [ n + 1 ] ans_1=2(\sum_{i=n}^{2n}height[i]-\sum_{i=0}^{n-1}height[i])-height[n]-height[n+1] ans1=2(i=n2nheight[i]i=0n1height[i])height[n]height[n+1]

而按照aAbBc的排列方式,答案是2A+2B-2b-a-c,也就是二倍的较大的n个数减去二倍的较小的n个数的和,再加上较小数中的两个最大数。更普遍的,它可以写作:
a n s 2 = 2 ( ∑ i = n + 1 2 n h e i g h t [ i ] − ∑ i = 0 n h e i g h t [ i ] ) + h e i g h t [ n ] + h e i g h t [ n − 1 ] ans_2=2(\sum_{i=n+1}^{2n}height[i]-\sum_{i=0}^{n}height[i])+height[n]+height[n-1] ans2=2(i=n+12nheight[i]i=0nheight[i])+height[n]+height[n1]

那么
a n s 1 − a n s 2 = 2 h e i g h t [ n ] − h e i g h t [ n + 1 ] − h e i g h t [ n − 1 ] ans_1-ans_2=2height[n]-height[n+1]-height[n-1] ans1ans2=2height[n]height[n+1]height[n1]
这个值显然不是总为非负数。这也就是说,默认按照第一种方式来计算的话会出问题。

一个很简单的数据:height=[1,2,5],此时ans1=5,而ans2=7.

不过当然,可能数据比较水,只考虑第一种排列方式也能过,但是稍加构造就能卡掉这种方法。

综上,在实际写的时候需要判断一下height[n]、height[n-1]、height[n+1]的关系,然后选择是用哪种方法构造序列。

不过我做的时候没想到用这个结论,是用双端队列来搞的,不过思路也是一样的,就是大小数交替出现。

我用了一个从0到3循环的标记,用来确定当前应该选大数还是小数。插入的时候判断是在前更优还是在后更优,这样就能避免总是采用ans1或者总是ans2.

猜你喜欢

转载自blog.csdn.net/m0_49792815/article/details/129330473