UVa 11300 Spreading the Wealth(有钱同使)
UVa 11300 - Spreading the Wealth(有钱同使)
Time limit: 6.000 seconds
Description - 题目描述
A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyone around a circular table. First, everyone has converted all of their properties to coins of equal value, such that the total number of coins is divisible by the number of people in the village. Finally, each person gives a number of coins to the person on his right and a number coins to the person on his left, such that in the end, everyone has the same number of coins. Given the number of coins of each person, compute the minimum number of coins that must be transferred using this method so that everyone has the same number of coins.
某村子准备重新分配财富进一步迈向共产主义。他们已召集好全部人等围坐在圆桌前。首先,每个人都把其全部财富转换为若干等价的硬币。然后将硬币总数除以村子人数。最后,每个人可以分别给予左右两人若干硬币,使得所有人的硬币数量相同。给你每个人的初始硬币数量,计算最少需要转移多少枚次(比对“人次”)硬币才能按上述方法完成最终分配。
CN
Input - 输入
There is a number of inputs. Each input begins with n (n < 1000001), the number of people in the village. n lines follow, giving the number of coins of each person in the village, in counterclockwise order around the table. The total number of coins will fit inside an unsigned 64 bit integer.
多组测试用例。每组以n(n < )打头,表示这个村子的总人数。随后n行以逆时针顺序给出桌上每个人的硬币数量。硬币的总数少于无符号64位整数。(然而实际情况似乎用有符号64位就能解决)
CN
Output - 输出
For each input, output the minimum number of coins that must be transferred on a single line.
对于每组测试用例,输出一行最少需要转移的硬币枚次。
CN
Sample Input - 输入样例
3
100
100
100
4
1
2
5
4
Sample Output - 输出样例
0
4
题解
绝对值不等式的题目,选好推倒的关系很快就能推出来。题目似乎在数据放水了,没有出到unsigned 64。
设:
第i个人给下一个人的硬币为Ci(其值可正可负)
第i个人初始硬币为Pi,第1~i个人的硬币之和为Spi
平均数为A
则:
P1 + Cn - C1 = A P2 + C1 - C2 = A P3 + C2 - C3 = A ................ Pn + Cn-1 - Cn = A
最终需要求的流动硬币的数量S = |C1| + |C2| + |C3| + ... + |Cn|
因此后面开始把C1 ~ Cn 化简出来:
C1 = P1 - A + Cn = Sp1 - A + Cn C2 = P2 - A + C1 = Sp1 + P2 - 2A + Cn = Sp2 - 2A + Cn C3 = P3 - A + C2 = Sp2 + P3 - 3A + Cn = Sp3 - 3A + Cn C4 = P4 - A + C3 = Sp3 + P4 - 4A + Cn = Sp4 - 4A + Cn ...................... Cn = Spn - nA + Cn
此时已经找出递推式了,后面为了说明简单,令Cpn = Spn - nA
S = |C1| + |C2| + |C3| + ... + |Cn| S = |Cp1+Cn| + |Cp2+Cn| + |Cp3+Cn| + ... |Cpn+Cn|
最后一个|Cpn+Cn|已经是0了,可以忽略掉:)
得到了S的表达式,我们要做的就是求最小值,由于S >= 0,很容易想到绝对值不等式。
|Cp1+Cn| + |Cp2+Cn| + |Cp3+Cn| + ... |Cpn+Cn| >= 0
如果取最小值,则 Cn = -(Cp1 ~ Cpn的中位数)。(n为偶数时靠左靠右无所谓,画个图就知道了:))
奇数
偶数
代码 C++
#include <cstdio>
#include <algorithm>
long long Sp[], Cp[];
int main(){
int n, i;
long long opt, Avg, Cn;
while (~scanf("%d", &n)){
for (i = ; i <= n; ++i){
scanf("%lld", &Sp[i]); Sp[i] += Sp[i - ];
}
Avg = Sp[--i] / n;
for (i = ; i <= n; ++i) Cp[i] = Sp[i] - Avg*i;
std::sort(Cp + , Cp + + n); opt = ;
Cn = -Cp[ + n >> ];
for (i = ; i <= n; ++i){
if ((Cp[i] += Cn) < ) Cp[i] = -Cp[i];
opt += Cp[i];
}
printf("%lld\n", opt);
}
return ;
}
UVa 11300 Spreading the Wealth(有钱同使)的更多相关文章
- 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[ ...
- UVA - 11300 Spreading the Wealth(数学题)
UVA - 11300 Spreading the Wealth [题目描述] 圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金 ...
- Uva 11300 Spreading the Wealth(递推,中位数)
Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...
- UVA 11300 Spreading the Wealth (数学推导 中位数)
Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...
- Math - Uva 11300 Spreading the Wealth
Spreading the Wealth Problem's Link ---------------------------------------------------------------- ...
- [ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]
Problem A Communist regime is trying to redistribute wealth in a village. They have have decided to ...
- UVA 11300 Spreading the Wealth
题目大意:n个人手中有些金币,每个人可给相邻两个人一些金币,使得最终每个人手中金币数相同,求被转手的金币最少数 m为最终每个人手中的金币数,a1,a2,a3,...,an为每个人开始时手中的金币数,x ...
随机推荐
- IOS第16天(3,Quartz2D饼图)
**** #import "HMPieView.h" #import "UIColor+Random.h" @implementation HMPieView ...
- URAL 2080 莫队
题意 有m种卡 给出卡的使用序列 要求每次从卡堆的顶部抽一张出来 刚好符合序列 输出初始 卡堆的排序 再输出每次抽出卡用后 卡插回卡堆的时候 这张卡上面有几张卡 初始排序很容易就可以搞出来 但是需要注 ...
- iOS开发UI篇—Quartz2D使用(绘制基本图形)
iOS开发UI篇—Quartz2D使用(绘制基本图形) 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 ...
- tomcat session cluster
Session的生命周期 以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期. Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessi ...
- markdown语法测试
斜体 粗体 百度 标题一 -------- 标题二 ======== 标题三 标题四 有序列表一 有序列表二 无序列表一 无序列表二 这是引用的文字 这是一句行内代码var=1 public clas ...
- Python开发程序:选课系统
本节作业: 选课系统 角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开3. ...
- 真正的让iframe自适应高度 兼容多种浏览器随着窗口大小改变
今天有朋友问到我关于"iframe自适应高度"的问题,原本以为是很简单的问题,没想到折腾了20分钟才搞定.期间遇到几个问题,要么是高度自适应了,但是当窗口改变时会出现滚动条.也就是 ...
- Vue 双层嵌套
这种的需要双层嵌套. 代码: <table id="ict-table" class="ict-table ict-report-table blue-theme& ...
- RDIFramework.NET ━ 9.16 案例模块━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.15 案例模块 -Web部分 9.16.1.产品管理模块 产品管理模块提供了基本的增.删.改.查.导出.分页等的实现,用户可 ...
- Python Decorator 和函数式编程
看到一篇翻译不错的文章,原文链接: Python Decorator 和函数式编程