均分紙牌詳解

2022-09-14 18:54:09 字數 1771 閱讀 8813

每個位置的紙牌可以移向相鄰位置,求使得所有位置紙牌數量相等所需的最小移動次數。

呈一條直線,位置 \(1\) 只和位置 \(2\) 相鄰,位置 \(n\) 只和位置 \(n-1\) 相鄰,其餘位置 \(i\) 和位置 \(i-1,i+1\) 相鄰。

令 \(\overline s\) 表示平均數,\(a_i\) 表示位置 \(i\) 的紙牌數量。考慮所有位置 \(m\):

除了必然需要的移動,我們發現剩下不需要任何移動了。

對於一次可以移動多張紙牌的情況,計算前兩種情況的數量即可;對於一次只能移動一張紙牌的情況,計算前兩種情況移動紙牌的總量即可。

呈乙個圓環,位置 \(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_\) 均需增大原 \(x_1\),\(x_4,x_5,x_6,x_8\) 均需減小原 \(x_1\)。

這樣保證不會出現負數,唯一的問題就是代價變大了。設增大的間隔有 \(l\) 個,那麼減小的就有 \(n-l\) 個,如果 \(n-l說明代價變大。

如果出現這種情況就換種調整方式,令 \(x_1\gets x_1\times 2\),這樣仍能保證不出現負數,並且此時 \(n-l>l\),代價變小了,這與我們假設最優解的前提相矛盾。

所以第一種調整方式一定會使得代價不變

對於一次可以移動多張紙牌的情況,在列舉的同時計算第三種情況的數量即可。

對於一次只能移動一張紙牌的情況就有點麻煩了

\[\sum_^n\left|(i-k)\times\overline s-\sum_^i a_j\right|+\sum_^k\left|(i+n-k)\times\overline s-\sum_^i a_j-\sum_^n a_j\right|

\]記 \(a\) 的字首和陣列為 \(pre\)

\[\sum_^n|pre_i-pre_k-(i-k)\times\overline s|+\sum_^n|pre_n-pre_k+pre_i-(i+n-k)\times\overline s|

\]令 \(a_i\gets a_i-\overline s\)

\[\sum_^n|pre_i-pre_k|+\sum_^k|pre_i+pre_n-pre_k|

\]因為 \(pre_n=0\),所以化簡成

\[\sum_^n|pre_i-pre_k|

\]顯然 \(pre_k\) 取中位數時最小。

拓展到乙個 \(n\times m\) 的二維矩陣,只需要保證每行的和都等於 \(\overline s\times m\),每一列的和都等於 \(\overline s\times n\)。

假設一行中相鄰兩位置發生了紙牌移動,那麼對於所有行來說,其各自的和不變;假設一列中相鄰兩位置發生了紙牌移動,那麼對於所有列來說,其各自的和不變。

也就是說每次移動會且僅會影響到一維,所以我們可以逐維進行調整,也就是對於每行和的陣列和每列和的陣列單獨做一遍一維的情況。

貪心 均分紙牌

時間限制 1 sec 記憶體限制 64 mb 提交 164 解決 95 提交 狀態 討論版 有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編...

均分紙牌問題

有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌的規則為 在編號為1上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編號為n 1的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在要求找出一種移動方法,...

貪心 均分紙牌

題目鏈結 題目描述 有n堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編號為n 1的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在...