【思维】UVA 11300 Spreading the Wealth
题目大意
有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。