均分纸牌问题
有 \(n\) 个人排成一列(或一个环),第 \(i\) 个人手里有 \(c_i\) 张牌,在每一步操作中,可以让某人给他左边或右边的人一张牌,问最少多少步可以让每个人手中的牌数相等。
线性均分纸牌问题
定义 \(\texttt{avg}\) 为总数的平均数,如果 \(\texttt{avg}\) 不是整数的话,就是无解。否则要使每堆纸牌的数量一样多的话,那么经过移动后要使 \(A_i=\texttt{avg}\)。
对于第一堆牌,它会与第二堆牌产生 \(\lvert x_1-\texttt{avg} \lvert\) 张牌的交换,多退少补,并累加答案。此时发现第一堆牌已经符合条件了,那么第一堆就可以忽略了,此时第二堆就变成了第一堆,继续重复上述步骤。
为什么这样做是最优的呢?可以发现在上述过程中,每一步都是必须的,没有多余的步骤,所以必然是最优解,这也是贪心思想的体现。
如果移牌的过程中出现负数怎么办?假设 \(c_i\) 在移动过程中是负数,那么接下来他一定会在 \(c_{i+1}\) 处拿牌。可以认为 \(i+1\) 向 \(i\) 给予牌是在 \(i\) 给予 \(i-1\) 牌之前,所以不影响结果。
对于如何统计答案,模拟上述过程,发现就是遍历每个人,并将其纸牌数变为 \(\texttt{avg}\)。假设要令 \(c_i=\texttt{avg}\),由算法流程可知,前 \(i-1\) 个人都有 \(c_j=\texttt{avg}\),而前 \(i\) 个人共有 \(tot_i\) 张纸牌(\(tot\) 是 \(c\) 的前缀和),并且后面的人没有给前 \(i\) 个人牌,所以说现在的 \(c_i=tot_i-(i-1)\times\texttt{avg}\),故第 \(i\) 个人与第 \(i+1\) 个人之间的纸牌交换数量为 \(\lvert c_i-\texttt{avg} \rvert=\lvert tot_i-i\times\texttt{avg}\rvert\)。而总的答案就是: $$\sum\limits_{i=1}^{n}\lvert tot_i-i\times\texttt{avg}\rvert$$
为了方便起见,可以一开始就将 \(c_i-\texttt{avg}\),那么最终就要使每个 \(c_i=0\),那么答案就是:$$\sum\limits_{i=1}^{n}\lvert tot_i \rvert$$
环形均分纸牌问题
约定:此问题沿用上述线性问题解法中的定义
解法一
假设第 \(i\) 个人给了第 \(i-1\) 个人 \(x_i\) 张卡牌,特别的,\(x_1\) 表示第 \(1\) 个人给了第 \(n\) 个人的牌的数量,所以此题的要求就是最小化 \(\sum\limits_{i=1}^{n}\lvert x_i \rvert\)。
由题意可得以下方程组:
将 \(x_i\)(\(i>1\))全部以 \(x_1\) 表示,可得:
令 \(t_i=\sum\limits_{j=1}^{i-1}c_j\),那么 \(x_i=x_1-t_i\),所以 \(\sum\limits_{i=1}^{n}\lvert x_i \rvert=\sum\limits_{i=1}^{n}\lvert x_1-t_i \rvert\)。
所以只需要选确定 \(x_1\) 的值就行了,这是经典的仓库选址问题,由结论可得,\(x_1\) 是 \(t\) 序列的中位数。
解法二
首先,有一个结论,那就是一定有一种最优解中有两个人之间没有发生纸牌交换。
证明
由解法一可得 \(x_1\) 是 \(t\) 序列的中位数,如果 \(t\) 的长度是奇数,那么 \(x_1=t_{\frac{n}{2}+1}\),否则 \(x_1\in[t_{\frac{n}{2}},t_{\frac{n}{2}+1}]\),所以 \(x_1\) 一定可以等于 \(t\) 中的某一个值,那么就有一个 \(x_i=x_1-t_i=0\),得证。
有了上述结论,就可以断环为链,转化为线性问题,此时 \(ans=\sum\limits_{i=1}^{n}\lvert tot_i\rvert\),所以只需要搞清楚 \(tot\) 数组的变化即可。
假设在第 \(k\) 个人之后断开,此时的 \(c\) 数组就变为了 $$c_{k+1},c_{k+2},\cdots,c_n,c_1,c_2,\cdots,c_k$$其对应的 \(tot\) 数组也就变为了 $$tot_{k+1}-tot_k,tot_{k+2}-tot_k,\cdots,tot_n-tot_k,tot_1+tot_n-tot_k,\cdots,tot_k+tot_n-tot_k$$因为每个 \(c_i\) 都减去了 \(\texttt{avg}\),所以 \(tot_n=0\),那么此时 \(ans=\sum\limits_{i=1}^{n}\lvert tot_i-tot_k\rvert\),与解法一的结论相似,即 \(tot_k\) 为 \(tot\) 序列的中位数。

浙公网安备 33010602011771号