UVA - 11300 Spreading the Wealth(数学题)
UVA - 11300 Spreading the Wealth
【题目描述】
圆桌旁边坐着n个人,每个人有一定数量的金币,金币的总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数量相等。您的任务是求出被转手的金币的数量的最小值。
【输入格式】
输入包含多组数据。每组数据第一行为一个整数n(n<=1000000)0),以下n行每行为一个整数,按逆时针顺序给出每个人拥有的金币数。输入结束标志为文件结束符(EOF)
【输出格式】
对于每组数据,输出被转手的金币的数量的最小值。输入保证这个值在 64位无符号整数的范围之内。
【Sample】
Input
3
100
100
100
4
1
2
5
4
Output
0
4
【Solution】
这是一道数学题
根据题意
每个人都可以给两边人传递硬币
为了简化问题
我们定向每个人i只能给下一个人x[i]枚硬币
那么我们的答案就是求\(|x_1| + |x_2| + ... + |x_n|\)的最小值
假设最终每个人分到num枚硬币
那么当前第i个人的情况是
a[i] - x[i] + x[i + 1] = num;
接下来就是推导式子
\(x_{i+1} = num - a_i + x_i\)
\(x_2 = num - a_1 + x_1\)
\(x_3 = num - a_2 + x_2\)
联立上述两个式子得到
\(x_2 = x_1 - (a_1 - num)\);
\(x_3 = x_2 - (a_1 + a_2 - 2 * num)\)
同理我们可以写出\(1\) ~ \(n\)所有的项数
所有的式子相加可以得到
$x_i = x_1 - $ \(\sum_{i = 1}^{n - 1} a_j - (n - 1) * m\)
由此可见,我们要求得答案只与\(x_1\)有关
拿一个\(tmp_i\)表示后面的一大坨\(\sum_{i = 1}^{n - 1} a_j - (n - 1) * m\)
我们的答案的表达式为
\(|x_1| + |x_2| + ... + |x_n| = |x_1| + |x_1 - tmp_2| + |x_1- tmp_3| + ... + |x_1- tmp_n|\)
根据这是一道数学题
不难想到
上述等式右边表示\(x _ 1\)到\(tmp_1\)~\(tmp_n\)的距离之和
显然,当\(x_1\)为集合$ {tmp_n} $的中位数时
该式子取得最小值
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
inline int read(){
int x = 0, w = 1;
char ch = getchar();
for(; ch > '9' || ch < '0'; ch = getchar()) if(ch == '-') w = -1;
for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - '0';
return x * w;
}
const int maxn = 1000010;
int a[maxn], tmp[maxn];
int num, n;
signed main(){
while(scanf("%lld", &n) != EOF){
memset(a, 0, sizeof a);
memset(tmp, 0, sizeof tmp);
int ans = 0;
int sum = 0;
for(int i = 1; i <= n ;i++){
a[i] = read();
sum += a[i];
}
num = sum / n;
tmp[1] = 0;
for(int i = 1; i < n; i++){
tmp[i + 1] = num - a[i] + tmp[i];
}
sort(tmp + 1, tmp + 1 + n);
int x = tmp[n / 2];
for(int i = 1; i <= n; i++){
ans += abs(x - tmp[i]);
}
cout << ans << endl;
}
return 0;
}
UVA - 11300 Spreading the Wealth(数学题)的更多相关文章
- UVa 11300 Spreading the Wealth(有钱同使)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
- 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(递推,中位数)
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 ---------------------------------------------------------------- ...
- UVA 11300 Spreading the Wealth (数学推导 中位数)
Spreading the Wealth Problem A Communist regime is trying to redistribute wealth in a village. They ...
- [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 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...
随机推荐
- 【Python源码剖析】对象模型概述
Python 是一门 面向对象 语言,实现了一个完整的面向对象体系,简洁而优雅. 与其他面向对象编程语言相比, Python 有自己独特的一面. 这让很多开发人员在学习 Python 时,多少有些无所 ...
- cocos2dx Android 使用ant 批量打包
参考文章: 例子:http://www.2cto.com/kf/201305/208139.html http://blog.csdn.net/ljb_blog/article/details/127 ...
- iOS -实现UIView圆角显示的方法
添加一个UIView时,默认直角显示有时对于有强迫症的患者还真有点不舒服! eg: 怎么实现UIview的圆角显示呢? 首先包含一个头文件: #import <QuartzCore/Quartz ...
- Centos7 搭建KVM并创建Linux Windows虚拟机
一.安装KVM 查看系统版本 cat /etc/redhat-release 关闭防火墙及selinux systemctl disable firewalld.service 查看防 ...
- [C#.NET 拾遗补漏]05:操作符的几个骚操作
阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...
- FastReport分组与聚合
本来看上去都觉得简单顺便训练下,是想对Customer表中的Company字段以第1个开头的字母分组,结果自己因喜欢将那些东西都集中在一起进行训练,在那个Master-Slave上做例子,并且没用另外 ...
- 面试必问:分布式锁实现之zk(Zookeeper)
点赞再看,养成习惯,微信搜索[三太子敖丙]关注这个互联网苟且偷生的工具人. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的 ...
- 小师妹学JVM之:JIT中的LogCompilation
目录 简介 LogCompilation简介 LogCompilation的使用 解析LogCompilation文件 总结 简介 我们知道在JVM中为了加快编译速度,引入了JIT即时编译的功能.那么 ...
- js中each函数的用法
官方说明: jQuery.each(object, [callback]) 概述 通用例遍方法,可用于例遍对象和数组. 不同于例遍 jQuery 对象的 $().each() 方法,此方法可用于例遍任 ...
- Redis - (Linux)安装与配置
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: 1:Redis支持数据的持久化,可以将内存 ...