cogs 1430. [UVa 11300]分金币
1430. [UVa 11300]分金币
★☆ 输入文件:Wealth.in 输出文件:Wealth.out 简单对比
时间限制:1 s 内存限制:256 MB
【题目描述】
圆桌旁坐着n个人,每个人有一定数量的金币
,金币数总能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数相等。你的任务是求出被转手的金币数量最小值。
比如,n=4,且4个人的金币数分别是1,2,5,4时,只需转移4枚金币(第3个人给第2个人2枚金币,第2个人和第4个人分别给第一个人1枚金币)即可实现每人手中的金币数相等。
【输入格式】
输入包括多组数据。每组数据的第一行为整数n(n≤1 000 000),以下n行每行为一个整数,按逆时针的顺序给出每个人拥有的金币数。输入结束标志为文件结束符(EOF).
【输出格式】
对于每组数据,输出被转手的金币数量的最小值。
输入保证这个值在64位无符号整数范围内。
【样例输入】
3
100
100
100
4
1
2
5
4
【样例输出】
0
4
【题目来源】
- Spreading the Wealth ,UVa 11300
思路:
这道题目看起来很复杂,让我们慢慢分析。首先,最终每个人的金币数量可以计算出来,他等于金币总数除以人数n。接下来我们用M来表示每个人最终拥有的金币数。
假设有4个人,按顺序编号为1,2,3,。假设1号给2号3枚金币,然后2号又给了1号5枚金币,这实际上等价于2号给1号2枚金币,而1号什么也没给2号。这样,可以设x2表示2号给了1号多少金币。如果x2<0,说明实际上是1给了2号-x2,枚金币。x1,x3和x4的含义类似。注意:由于是环形,x1指的是1号给4号多少金币。 现在假设编号为i的人初始有Ai枚金币。对于1号来说,他给了4号x1枚金币,还剩A1-x1枚;但因为2号给了他x2枚金币,所以最后还剩A1-x1+x2枚金币。根据题设,该金币数等于M。换句话说,我们得到了一个方程:A1-x1+x2=M。
同理,对于第2个人,有A2-X2+X3=M。最终,我们可以得到n个方程,一共有n个变量,是不是可以直接解方程组了呢?很可惜,还是不行。因为从前n-1个人方程可以推导出最后一个方程。所以,实际上只有n-1个方程是有用的。
尽管无法直接解出答案,我们还是可以尝试着用x1表示出其他的xi,则本题就变成了单变量的极值问题。
对于第1个人,A1-x1+x2=M==>x2=M-A1+x1=x1-C1(规定C1=A1-M,下面类似)
对于第2个人,A2-x2+x3=M==>x3=M-A2+x2=2*M-A1-A2+x1=x1-C2
对于第3个人,A3-x3+x4=M==>x4=M-A3+x3=3*M-A1-A2-A3+x1=x1-C3
······
对于第n个人,An-xn+x1=M。(这是一个多余的等式,并不能给我们更多的信息)
我们希望所有xi的绝对值之和尽可能的小,即|x1|+|x1-C1|+|x1-C2|+······+|x1-Cn-1|要最小。到|x1-Ci|的几何意义是数轴上点x1到Ci的距离,所以问题就变成了:给定数轴上n个点,找出一个到她们的距离之和尽量小的点。
可以猜想到这个最优的x1就是这些数的“中位数”(即排序以后位于中间的数),因此只要排个序就可以了。 证明:注意,我们要证明的是:给定数轴上的n个点,在数轴上的所有点中,中位数离所有顶点的距离之和最小。凡是能转化为这个模型的题目都可以用中位数求解并不只适用于本题。 画出来后如下图所示:

任意找一个点,比如上图中的灰点。他的左边有4个输入点,右边有2个输入点。把他往左移动一点,不要移的太多,以免碰到输入点。假设移动了d单位距离。则灰点左边4个点到他的距离个减少了d,右边两个点到他的距离各增加了d,但总的来说,距离之和减少了2d。
如果灰点左边有2个点,右边有4个点,道理类似,不过应该向右移动。换句话说,只要灰点左右的输入点数不一样多,就不是最优解。什么情况下左右的输入点一样多呢?如果输入点一共有奇数个,则灰点必须和中间的那个点重合(中位数);如果有偶数个,则灰点可以位于最中间的两个点之间的任意位置(还是中位数)。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1000100
using namespace std;
long long n,tot,ans;
long long val[MAXN],C[MAXN];
int main(){
freopen("Wealth.in","r",stdin);
freopen("Wealth.out","w",stdout);
while(scanf("%d",&n)!=EOF){
tot=;
for(int i=;i<=n;i++){
scanf("%I64d",&val[i]);
tot+=val[i];
}
tot/=n;C[]=;
for(int i=;i<n;i++)
C[i]=C[i-]+val[i]-tot;
sort(C,C+n);
long long x1=C[n/];ans=;
for(int i=;i<n;i++) ans+=abs(x1-C[i]);
printf("%I64d\n",ans);
}
}
cogs 1430. [UVa 11300]分金币的更多相关文章
- UVa 11300 分金币
https://vjudge.net/problem/UVA-11300 题意: 圆桌上有n个人,每个人都有一定的初始金币,每个人可以给他旁边的人一些金币,最终使每个人的金币数相等.计算最少需要转手的 ...
- uva 11300 分金币(利用绝对值加和进行求出最小值)
//qq 767039957 welcome #include<cstdio> #include<algorithm> #include<vector> #incl ...
- 【贪心+中位数】【UVa 11300】 分金币
(解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...
- UVA - 11300 Spreading the Wealth(数学题)
UVA - 11300 Spreading the Wealth [题目描述] 圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金 ...
- uva 11300 - Spreading the Wealth(数论)
题目链接:uva 11300 - Spreading the Wealth 题目大意:有n个人坐在圆桌旁,每个人有一定的金币,金币的总数可以被n整除,现在每个人可以给左右的人一些金币,使得每个人手上的 ...
- UVA.11300 Spreading the Wealth (思维题 中位数模型)
UVA.11300 Spreading the Wealth (思维题) 题意分析 现给出n个人,每个人手中有a[i]个数的金币,每个人能给其左右相邻的人金币,现在要求你安排传递金币的方案,使得每个人 ...
- 数学/思维 UVA 11300 Spreading the Wealth
题目传送门 /* 假设x1为1号给n号的金币数(逆时针),下面类似 a[1] - x1 + x2 = m(平均数) 得x2 = x1 + m - a[1] = x1 - c1; //规定c1 = a[ ...
- 分金币 bzoj 3293
分金币(1s 128M) coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...
- UVa 11300 Spreading the Wealth(有钱同使)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
随机推荐
- Java transientkeyword使用小记
1. transient的作用及用法 我们都知道一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化,java的这样的序列化模式为开发人员提供了非常多便利.我们能够不必关系详细序列化 ...
- HDU 5399 Too Simple (2015年多校比赛第9场)
1.题目描写叙述:点击打开链接 2.解题思路:本题分情况讨论.比赛时候真是想的太简单了.以为就是(n!)^(cnt-1). 终于无限WA. 本题有几个特殊情况须要额外推断. 首先,假设输入的时候.有某 ...
- 递归神经网络——就是解决AST这样的问题
原文:https://zybuluo.com/hanbingtao/note/626300 有时候把句子看做是词的序列是不够的,比如下面这句话『两个外语学院的学生』: 上图显示了这句话的两个不同的语法 ...
- windows下远程链接虚拟机Linux下MySQL数据库问题处理
参考解决:https://www.cnblogs.com/blogforly/p/5997553.html 今天远程连接虚拟机中的MySQL数据库,一直连不上,在网上搜索了一下,发现原因是MySQL对 ...
- mongodb 主从
mongodb 主从 因为条件限制我们把主从放在一台服务器上面 相关参数 在启动从的时候可以增加以下参数 --autoresync 当发现从服务器的数据不是最新时,开始从主服务器请求同步数据 --sl ...
- JS获取当前时间(YYYY-MM-DD ),element显示默认当前时间,显示默认昨天,显示默认上个月
原文链接:点我 进来的随便看看,或许有帮助 vue+element-ui datepicker 设置默认日期用的框架是vue+element-ui ,以下是时间控件 <el-form-ite ...
- md5sum---文件校验和
md5sum命令采用MD5报文摘要算法(128位)计算和检查文件的校验和.一般来说,安装了Linux后,就会有md5sum这个工具,直接在命令行终端直接运行. MD5算法常常被用来验证网络文件传输的完 ...
- 【习题 8-16 UVA - 1618】Weak Key
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举N[q]和N[r]的位置 因为N[q]是最大值,且N[r]是最小值. 且它们是中间的两个. 枚举这两个可以做到不重复枚举. 然后 ...
- 洛谷 P1454 圣诞夜的极光
P1454 圣诞夜的极光 题目背景 圣诞夜系列~~ 题目描述 圣诞老人回到了北极圣诞区,已经快到12点了.也就是说极光表演要开始了.这里的极光不是极地特有的自然极光景象.而是圣诞老人主持的人造极光. ...
- bootstrap结合google code prettify的问题
发现prettify不能显示行号,于是上网找了解决方法: 只使用prettify的js的文件,不使用css文件,另外添加这段css: .com { color: #93a1a1; } .lit { c ...