博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分金币 Uva 11300
阅读量:6956 次
发布时间:2019-06-27

本文共 849 字,大约阅读时间需要 2 分钟。

题意

给定N个人成环状坐,每个人初始分配Ai的金币,金币总数可以被N整除,每个人可以给左右相邻的人一定数量的金币使得最终每个人的金币数量相同,求转移数量最小的方案所转移的总金币数量。

N<=1000000

对每组数据保证输出在INT64范围之内。

 

1.最终每个人拥有的金币可以直接确定,设为M

2.设xi表示第i个人从上一个人手中获得的金币,若为负则标识它会给上一个人金币,注意x1是从第n个人手中获得金币的数量

3.我们的目标是使得 |x1|  + |x2| + ... |xn| 最小,并且使它可以以单变量表示

 

列出方程组

a1 + x1 - x2 = m

a2 + x2 - x3 = m

...

an + xn - x1 = m

转化得

x1 = m + x2 - a1

x2 = m + x3 - a2

...

xn-2 = m + xn-1 - an-2

xn-1 = m + xn - an-1

xn = xn

 

则有

xn-1 = xn - (an-1 - m)

xn-2 = xn-1  - (an-2 - m) = xn - (an-1 - m) - (an-2 - m)

xn-3 = ... = xn - (an-1 - m) - (an-2 - m) - (an-3 - m)

..

x1 = xn - (an-1 - m) - ... - (a1 - m)

引入数列Ci

Cn-1 = an-1 - m

Ck = Ck+1 + (ak - m)

所以

xn-1 = xn - Cn-1

xn-2 = xn - Cn-2

..

x1 = xn - C1

所以最终要求的就是|xn - C1| + |xn - C2| ... |xn - Cn-1| + |xn|

转化为物理意义,就是0,C1..Cn-1的数轴上,选取一个点,使得它到所有点的距离之和最小。

可证,为这些数的中位数。

转载于:https://www.cnblogs.com/dandi/p/4590592.html

你可能感兴趣的文章
CSS负边距的几种应用
查看>>
正则学习
查看>>
有多个按钮,点击一个变色,点击另一个变色,原来的恢复颜色的方法
查看>>
31天重构学习笔记5. 提升字段
查看>>
强口令检测(使用正则表达式)
查看>>
燃尽图
查看>>
口碑订购会员营销网页无法打开,提示网页可能暂时无法连接
查看>>
Linux虚拟机添加硬盘
查看>>
Unable to resolve module LinkedStateMixin
查看>>
Socket通信3——用Swing来构建电脑服务端界面
查看>>
pandas和numpy学习
查看>>
------第二节-----------------第二讲----单链表的基本操作---------
查看>>
查看LINUX进程内存占用情况
查看>>
在非activity类调用startActivityForResult
查看>>
Logstash使用grok过滤nginx日志
查看>>
Codeforces632E 选择/小偷与商店 背包DP
查看>>
5.索引简介
查看>>
重定位细节[1]
查看>>
索引器
查看>>
UVa 11044 - Searching for Nessy
查看>>