有 \(n\) 個人排成一列(或一個環),第 \(i\) 個人手裡有 \(c_i\) 張牌,在每一步操作中,可以讓某人給他左邊或右邊的人一張牌,問最少多少步可以讓每個人手中的牌數相等。
線性均分紙牌問題
首先定義 \(\texttt{avg}\) 為紙牌總數的平均數,如果 \(\texttt{avg}\) 不是整數的話,那麼就是無解。否則如果要使每堆紙牌的數量一樣多的話,那麼經過移動後要使 \(A_i=\texttt{avg}\)。
對於第一堆牌,它只能向第二堆牌索取,或者進行給予。設 \(x=A_i-\texttt{avg}\)。如果 \(x>0\),那麼就把多的給第二堆。如果 \(x<0\),不管怎麼移動,必然有幾步是第二堆給第一堆 \(\lvert x \rvert\) 張牌。上述兩種情況答案需要增加。如果 \(x=0\),就不用管了。
此時我們發現第一堆牌已經符合條件了,那麼第一堆就可以直接忽略了,此時第二堆就變成了第一堆,繼續重複上述步驟。
如何說明這樣做是最優的呢?我們發現在上述過程中,每一步都是必須的,沒有多餘的步驟,所以其必然是最優解,這也是貪心思想的體現。
如果移牌的過程中出現負數怎麼辦?假設 \(c_i\) 在移動過程中是負數,那麼接下來他一定會在 \(c_{i+1}\) 處拿牌。可以認為 \(i+1\) 向 \(i\) 給予牌是在 \(i\) 給予 \(i-1\) 牌之前,所以不影響結果。
對於統計答案,顯然可以直接模擬,不過如果令 \(tot\) 是 \(c\) 的字首和,可以發現讓前 \(i\) 個人 \(c_i=\texttt{avg}\) 的代價就是 \(\sum\limits_{j=1}^{i} \lvert j*\texttt{avg}-tot_j \rvert\),證明如下: