分金币,根据蓝书的思想;
最后的每个人的金币数假设是M;
则M = sum/n;
对于1来说,给4号x1枚金币,2号给1号x2枚金币,(x1,x2……可能为负)
则 A1 -x1+x2=M;
对于2来说,给1号x2枚金币,3号给2号x3枚金币
则A2-x2+x3 = M;
以此类推;
A3 - x3+x4 =M;
A4 - x4 + x1 = M;
化简一下,令C1 = A1 - M;
x2 = x1-C1;
x3 = x2-A2+M = x1 - (C1+A2-M),此时令C2 = C1+A2-M;
所以x3 = x1-C2;
以此类推;
x4 = x1-C3(C3 = C2 +A2 - M)
…………
所以找到了Ci的递归规律;
即Ci = Ci-1 +Ai - M;
我们要求的就是|x1|+|x1-C1|+|x1-C2|+|x1-C3|+……+|x1-Cn-1|的最小值;
那么问题就得到转化:
在数轴上给定n个点,问数轴中的某个点x1到C0(C0 = 0), C1, C2 …… Cn-1的距离的和的最小值;
结论其实这个点就是这些点的中位数(从小到大排序,中间那个数);
我们做一下假设,左边有四个点,右边有2个点,那么把这个最有点向左移动,左边减少4d,右边减少2d,证明不是最优点,而当左右恰好为三个点时,就OK,这时要考虑一个问题;就是有奇数个点还是偶数个点,如果奇数个点,就一定是中间那个点,不能移动,一旦移动两边点数就会不一样,而如果是偶数个点,那么就一定是n/2和n/2+1中间(包括边界)的任意一个点,为什么任意呢,因为移动不影响,比如向左移,左边减多少,右边就加多少,因为点数一样多,向右移同理;
那么我们就先把Ci来求出来,由上面的递推公式,Ci = Ci-1 + Ai + M;
然后就求x1的最小值,即C[n/2];
在求x1的最小值时,切记把C排序,因为中位数嘛,在数轴上,而C是数组,所以要排下序,模拟一个数轴;
由于int取整,n/2所对应的点一定是中位数,记得有C0这个点;
求出来后就直接一个for循环来求|x1-Ci|;
即为ans;
求绝对值可以用abs(x1 - Ci);
证毕;
UVA 13000 分金币
最新推荐文章于 2019-03-07 14:53:53 发布