题目大意

vjudge链接

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

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

数据范围

n<1000001

样例输入

样例输出

思路

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

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

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

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

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

设C=A-m,C=C+A-m……

则移项得到x=x-C
答案是|x|+|x-C|+……+|x-C|的最小值,

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

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

证明见链

05-17 17:41