首先,如果有某序列ai,則∑i=1n∣ai−k∣取最小值時,k爲ai的中位數。(因爲如果是pos,則pos向靠近中位數的位置移動能更小),這個性質也能dp
有n個人站成一排,每個人有ai張紙牌,求最小移動次數使得每個人紙牌數一樣,一張紙牌交給旁邊的人記爲一次移動。
如果tot是n的倍數,則有解,設t=tot/n
遍歷一遍,對於第i個人,ans+=abs(a[i]-t),a[i+1]-=t-a[i]。
也就是:ans=∣a1−t∣+∣a2+a1−2t∣+∣a3+a2+a1−3t∣+⋯+∣∑i=1nai−nt∣
如果令sk=(∑i=1kai)−kt=∑i=1k(ai−t)
ans=∑i=1n∣si∣
如果bi=ai−t,答案就是b的n個前綴和的絕對值之和。
如果是n個人站成一圈,那麼,必然有兩個人之間是沒有交換的,將這兩個人斷開,變成一條鏈,假設在位置p和p+1之間斷開,且s是原序列的前綴和,則新的前綴和從p+1處開始:
∣sp+1−sp∣
∣sp+2−sp∣
…
∣sn−sp∣
∣sn+s1−sp∣
…
∣sn+sp−1−sp∣
∣sn+sp−sp∣
如果s是b的前綴和,則sn=0
ans=∑i=1n∣si−sp∣,欲使ans最小,sp爲s的中位數
有n個人,第i個人站在xi的位置,求使他們站成連續的一列的最小花費。
顯然,每個人的相對位置不變,設最終他們站在點a、a+1、… a+n-1點,則花費
ans=∑i=1n∣xi−(a+i−1)∣=∑i=1n∣(xi−i+1)−a∣,所以a是序列:
bi=xi−i−1的中位數。