首先,如果有某序列(a_i),则(sum_{i=1}^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_{i=1}^na_i-nt|)
如果令(s_k=(sum_{i=1}^ka_i)-kt=sum_{i=1}^k(a_i-t))
(ans=sum_{i=1}^n |s_i|)
如果(b_i=a_i-t),答案就是b的n个前缀和的绝对值之和。
如果是n个人站成一圈,那么,必然有两个人之间是没有交换的,将这两个人断开,变成一条链,假设在位置p和p+1之间断开,且s是原序列的前缀和,则新的前缀和从p+1处开始:
(|s_{p+1}-s_p|)
(|s_{p+2}-s_p|)
(dots)
(|s_n-s_p|)
(|s_n+s_1-s_p|)
(dots)
(|s_n+s_{p-1}-s_p|)
(|s_n+s_{p}-s_p|)
如果s是b的前缀和,则(s_n=0)
(ans=sum_{i=1}^n|s_i-s_p|),欲使ans最小,(s_p)为s的中位数
有n个人,第i个人站在(x_i)的位置,求使他们站成连续的一列的最小花费。
显然,每个人的相对位置不变,设最终他们站在点a、a+1、... a+n-1点,则花费
(ans=sum_{i=1}^n |x_i-(a+i-1)|=sum_{i=1}^n |(x_i-i+1)-a|),所以a是序列:
(b_i=x_i-i-1)的中位数。