紙牌均分問題

2022-07-25 04:09:13 字數 984 閱讀 1386

首先,如果有某序列\(a_i\),則\(\sum_^n|a_i-k|\)取最小值時,k為\(a_i\)的中位數。(因為如果是pos,則pos向靠近中位數的位置移動能更小),這個性質也能dp

有n個人站成一排,每個人有\(a_i\)張紙牌,求最小移動次數使得每個人紙牌數一樣,一張紙牌交給旁邊的人記為一次移動。

如果tot是n的倍數,則有解,設t=tot/n

遍歷一遍,對於第i個人,ans+=abs(a[i]-t),a[i+1]-=t-a[i]。

也就是:\(ans=|a_1-t|+|a_2+a_1-2t|+|a_3+a_2+a_1-3t|+\dots+|\sum_^na_i-nt|\)

如果令\(s_k=(\sum_^ka_i)-kt=\sum_^k(a_i-t)\)

\(ans=\sum_^n |s_i|\)

如果\(b_i=a_i-t\),答案就是b的n個字首和的絕對值之和。

如果是n個人站成一圈,那麼,必然有兩個人之間是沒有交換的,將這兩個人斷開,變成一條鏈,假設在位置p和p+1之間斷開,且s是原序列的字首和,則新的字首和從p+1處開始:

\(|s_-s_p|\)

\(|s_-s_p|\)

\(\dots\)

\(|s_n-s_p|\)

\(|s_n+s_1-s_p|\)

\(\dots\)

\(|s_n+s_-s_p|\)

\(|s_n+s_-s_p|\)

如果s是b的字首和,則\(s_n=0\)

\(ans=\sum_^n|s_i-s_p|\),欲使ans最小,\(s_p\)為s的中位數

有n個人,第i個人站在\(x_i\)的位置,求使他們站成連續的一列的最小花費。

顯然,每個人的相對位置不變,設最終他們站在點a、a+1、... a+n-1點,則花費

\(ans=\sum_^n |x_i-(a+i-1)|=\sum_^n |(x_i-i+1)-a|\),所以a是序列:

\(b_i=x_i-i-1\)的中位數。

均分紙牌問題

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

貪心 均分紙牌

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

貪心 均分紙牌

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