首先,如果有某序列 a i a_i ai,则 ∑ i = 1 n ∣ a i − k ∣ \sum_{i=1}^n|a_i-k| ∑i=1n∣ai−k∣取最小值时,k为 a i a_i ai的中位数。(因为如果是pos,则pos向靠近中位数的位置移动能更小),这个性质也能dp
有n个人站成一排,每个人有
a
i
a_i
ai张纸牌,求最小移动次数使得每个人纸牌数一样,一张纸牌交给旁边的人记为一次移动。
如果tot是n的倍数,则有解,设t=tot/n
遍历一遍,对于第i个人,ans+=abs(a[i]-t),a[i+1]-=t-a[i]。
也就是:
a
n
s
=
∣
a
1
−
t
∣
+
∣
a
2
+
a
1
−
2
t
∣
+
∣
a
3
+
a
2
+
a
1
−
3
t
∣
+
⋯
+
∣
∑
i
=
1
n
a
i
−
n
t
∣
ans=|a_1-t|+|a_2+a_1-2t|+|a_3+a_2+a_1-3t|+\dots+|\sum_{i=1}^na_i-nt|
ans=∣a1−t∣+∣a2+a1−2t∣+∣a3+a2+a1−3t∣+⋯+∣∑i=1nai−nt∣
如果令
s
k
=
(
∑
i
=
1
k
a
i
)
−
k
t
=
∑
i
=
1
k
(
a
i
−
t
)
s_k=(\sum_{i=1}^ka_i)-kt=\sum_{i=1}^k(a_i-t)
sk=(∑i=1kai)−kt=∑i=1k(ai−t)
a
n
s
=
∑
i
=
1
n
∣
s
i
∣
ans=\sum_{i=1}^n |s_i|
ans=∑i=1n∣si∣
如果
b
i
=
a
i
−
t
b_i=a_i-t
bi=ai−t,答案就是b的n个前缀和的绝对值之和。
如果是n个人站成一圈,那么,必然有两个人之间是没有交换的,将这两个人断开,变成一条链,假设在位置p和p+1之间断开,且s是原序列的前缀和,则新的前缀和从p+1处开始:
∣
s
p
+
1
−
s
p
∣
|s_{p+1}-s_p|
∣sp+1−sp∣
∣
s
p
+
2
−
s
p
∣
|s_{p+2}-s_p|
∣sp+2−sp∣
…
\dots
…
∣
s
n
−
s
p
∣
|s_n-s_p|
∣sn−sp∣
∣
s
n
+
s
1
−
s
p
∣
|s_n+s_1-s_p|
∣sn+s1−sp∣
…
\dots
…
∣
s
n
+
s
p
−
1
−
s
p
∣
|s_n+s_{p-1}-s_p|
∣sn+sp−1−sp∣
∣
s
n
+
s
p
−
s
p
∣
|s_n+s_{p}-s_p|
∣sn+sp−sp∣
如果s是b的前缀和,则
s
n
=
0
s_n=0
sn=0
a
n
s
=
∑
i
=
1
n
∣
s
i
−
s
p
∣
ans=\sum_{i=1}^n|s_i-s_p|
ans=∑i=1n∣si−sp∣,欲使ans最小,
s
p
s_p
sp为s的中位数
有n个人,第i个人站在
x
i
x_i
xi的位置,求使他们站成连续的一列的最小花费。
显然,每个人的相对位置不变,设最终他们站在点a、a+1、… a+n-1点,则花费
a
n
s
=
∑
i
=
1
n
∣
x
i
−
(
a
+
i
−
1
)
∣
=
∑
i
=
1
n
∣
(
x
i
−
i
+
1
)
−
a
∣
ans=\sum_{i=1}^n |x_i-(a+i-1)|=\sum_{i=1}^n |(x_i-i+1)-a|
ans=∑i=1n∣xi−(a+i−1)∣=∑i=1n∣(xi−i+1)−a∣,所以a是序列:
b
i
=
x
i
−
i
−
1
b_i=x_i-i-1
bi=xi−i−1的中位数。