均分纸牌详解

引入

每个位置的纸牌可以移向相邻位置,求使得所有位置纸牌数量相等所需的最小移动次数。

线形

呈一条直线,位置 (1) 只和位置 (2) 相邻,位置 (n) 只和位置 (n-1) 相邻,其余位置 (i) 和位置 (i-1,i+1) 相邻。

(overline s) 表示平均数,(a_i) 表示位置 (i) 的纸牌数量。考虑所有位置 (m)

  • 如果 (sumlimits_{i=1}^m a_i<m imesoverline s),那么必然需要从 (m+1)(m)(m imesoverline s-sumlimits_{i=1}^m a_i) 张纸牌。
  • 如果 (sumlimits_{i=1}^m a_i>m imesoverline s),那么必然需要从 (m)(m+1)(left(sumlimits_{i=1}^m a_i ight)-m imesoverline s) 张纸牌。
  • 如果 (sumlimits_{i=1}^m a_i=m imesoverline s),那么移动如果跨过 (m)(m+1) 之间肯定不优。

除了必然需要的移动,我们发现剩下不需要任何移动了。

对于一次可以移动多张纸牌的情况,计算前两种情况的数量即可;对于一次只能移动一张纸牌的情况,计算前两种情况移动纸牌的总量即可。

环形

呈一个圆环,位置 (1) 和位置 (n,2) 相邻,位置 (n) 和位置 (n-1,1) 相邻,其余位置 (i) 和位置 (i-1,i+1) 相邻。

可以暴力枚举断点破环成链做到 (O(n^2)),证明考虑构造出一组存在至少一对相邻位置之间没有移动的最优解。


因为相邻两位置肯定只会单向移动,所以相邻位置之间都有移动的所有最优解一定是如下形式:

其中 (x) 表示间隔移动的纸牌数量,不妨设最小的为 (x_1)

现在将 (x_1) 置为 (0),然后调整平衡。图中 (x_2,x_3,x_7,x_9,x_{10}) 均需增大原 (x_1)(x_4,x_5,x_6,x_8) 均需减小原 (x_1)

这样保证不会出现负数,唯一的问题就是代价变大了。设增大的间隔有 (l) 个,那么减小的就有 (n-l) 个,如果 (n-l<l) 说明代价变大。

如果出现这种情况就换种调整方式,令 (x_1gets x_1 imes 2),这样仍能保证不出现负数,并且此时 (n-l>l),代价变小了,这与我们假设最优解的前提相矛盾。

所以第一种调整方式一定会使得代价不变


对于一次可以移动多张纸牌的情况,在枚举的同时计算第三种情况的数量即可。

对于一次只能移动一张纸牌的情况就有点麻烦了

[sum_{i=k+1}^nleft|(i-k) imesoverline s-sum_{j=k+1}^i a_j ight|+sum_{i=1}^kleft|(i+n-k) imesoverline s-sum_{j=1}^i a_j-sum_{j=k+1}^n a_j ight| ]

(a) 的前缀和数组为 (pre)

[sum_{i=k+1}^n|pre_i-pre_k-(i-k) imesoverline s|+sum_{i=1}^n|pre_n-pre_k+pre_i-(i+n-k) imesoverline s| ]

(a_igets a_i-overline s)

[sum_{i=k+1}^n|pre_i-pre_k|+sum_{i=1}^k|pre_i+pre_n-pre_k| ]

因为 (pre_n=0),所以化简成

[sum_{i=1}^n|pre_i-pre_k| ]

显然 (pre_k) 取中位数时最小。

二维

拓展到一个 (n imes m) 的二维矩阵,只需要保证每行的和都等于 (overline s imes m),每一列的和都等于 (overline s imes n)

假设一行中相邻两位置发生了纸牌移动,那么对于所有行来说,其各自的和不变;假设一列中相邻两位置发生了纸牌移动,那么对于所有列来说,其各自的和不变。

也就是说每次移动会且仅会影响到一维,所以我们可以逐维进行调整,也就是对于每行和的数组和每列和的数组单独做一遍一维的情况。

原文地址:https://www.cnblogs.com/May-2nd/p/14974815.html