题目大意

vjudge链接

有n个人围圆桌而坐,每个人有Ai个金币,每个人可以给左右相邻的人一些金币。

若使得最终所有人金币数相等,求最小金币转移数。

数据范围

n<1000001

样例输入

3
100
100
100
4
1
2
5
4

样例输出

0
4

思路

可以算出最后每个人的钱数m为总钱数除以人数n。

比如,1号给2号x枚金币,相当于2号给1号-x枚金币。

所以只要考虑n→n-1,n-1→n-2,……,1→n即可。

设xi为i给i-1的金币数量。

假设i初始有Ai枚金币,最终钱数为m,则Ai-xi+xi+1=M。

设C1=A1-m,C2=C1+A2-m……

则移项得到xi+1=x1-Ci
答案是|x1|+|x1-C1|+……+|x1-Cn-1|的最小值,

因此问题就变成了在数轴上有n个点,找出一个和他们距离和最小的点。

可以得到这个点就是这些数的中位数,排序即可,或者用nth_element。

证明见链

 

相关文章:

  • 2021-04-03
  • 2021-10-16
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-01-14
  • 2021-11-04
  • 2022-12-23
猜你喜欢
  • 2021-10-06
  • 2021-12-19
  • 2021-10-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-02-22
相关资源
相似解决方案