#lydlx00x0807. 糖果传递

糖果传递

糖果传递问题

题目描述

nn 个小朋友坐成一圈,每人有 a[i]a[i] 个糖果。

每人只能给左右两人传递糖果。

每人每次传递一个糖果代价为 11

求使所有人获得均等糖果的最小代价。

输入格式

第一行输入一个正整数 nn,表示小朋友的个数。

接下来 nn 行,每行一个整数 a[i]a[i],表示第 ii 个小朋友初始得到的糖果的颗数。

输出格式

输出一个整数,表示最小代价。

输入输出样例 #1

输入 #1

4
1
2
5
4

输出 #1

4

输入输出样例 #2

输入 #2

5
1
2
3
4
5

输出 #2

5

限制条件

  • 1n10000001 \le n \le 1000000
  • 0a[i]2×1090 \le a[i] \le 2 \times 10^9
  • 数据保证一定有解

样例解释 #1

初始糖果数:[1,2,5,4][1, 2, 5, 4]

平均糖果数:1+2+5+44=3\frac{1+2+5+4}{4} = 3

需要传递糖果使每人都有 33 个糖果。

一种最优方案:

  1. 第 3 个小朋友给第 2 个小朋友 11 个糖果(第 2 个小朋友现在有 33 个,第 3 个有 44 个)
  2. 第 3 个小朋友给第 4 个小朋友 11 个糖果(第 4 个小朋友现在有 55 个,第 3 个有 33 个)
  3. 第 4 个小朋友给第 1 个小朋友 22 个糖果(第 1 个小朋友现在有 33 个,第 4 个有 33 个)

总传递糖果数:1+1+2=41 + 1 + 2 = 4,代价为 44

数学模型

设最终每人糖果数为 avg=i=1na[i]navg = \frac{\sum_{i=1}^n a[i]}{n}

xix_i 表示第 ii 个小朋友给第 i1i-1 个小朋友的糖果数(正数表示给,负数表示收)。

则对于第 ii 个小朋友: a[i]xi+xi+1=avga[i] - x_i + x_{i+1} = avg (注意 xn+1=x1x_{n+1} = x_1,因为是环形)

整理得: xi+1=xi+(avga[i])x_{i+1} = x_i + (avg - a[i])

ci=j=1i(a[j]avg)c_i = \sum_{j=1}^i (a[j] - avg),则有: xi+1=x1cix_{i+1} = x_1 - c_i

总代价为 i=1nxi\sum_{i=1}^n |x_i|

问题转化为:求一个 x1x_1,使得 i=1nx1ci1\sum_{i=1}^n |x_1 - c_{i-1}| 最小(其中 c0=0c_0 = 0)。

这是一个经典的货仓选址问题,最优解为取 ci1c_{i-1} 的中位数作为 x1x_1

算法步骤

  1. 计算平均值 avgavg
  2. 计算前缀和 ci=j=1i(a[j]avg)c_i = \sum_{j=1}^i (a[j] - avg)
  3. cc 数组排序
  4. 取中位数 mid=cn2mid = c_{\lfloor \frac{n}{2} \rfloor}
  5. 计算 i=0n1midci\sum_{i=0}^{n-1} |mid - c_i| 即为答案