首先,如果有某序列\(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的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在...