均分紙牌問題

zhuluoan發表於2024-09-11

\(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\),證明如下:

相關文章