题目大意
有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。