UVA 11300 Spreading the Wealth (数学推导 中位数)
Spreading the Wealth
Problem
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.
The 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.
The Output
For each input, output the minimum number of coins that must be transferred on a single line.
Sample Input
3
100
100
100
4
1
2
5
4
Sample Output
0
4
题目大意:圆桌旁边坐着n个人,每人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。比如n=4,且4个人的金币数量分别为1,2,5,4时,只需转移4枚金币(第3个人给第2个人2枚金币,第2个人和第4个人分别给第1个人1枚金币)即可实现每人手中的金币数目相等。
分析:首先最终每个人的金币数量可以计算出来,它等于金币总数除以人数n。接下来用M来表示每个人最终拥有的金币数。
现在假设编号为 i 的人初始有Ai 枚金币,对于1号来说,他给了4号x1枚金币,还剩Ai -x1枚金币;但是2号给了他x2枚金币,所以还剩A1-x1+x2枚金币。所以A1-x1+x2=M。同理对于第2个人,有A2-x2+x3=M。最终得到n个方程,实际上只有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=2M-A1-A2+x1=x1-C2
对于第3个人,A3-x3+x4=M →x4=M-A3+x3=3M-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个点,找出一个到他们距离之和尽量小的点。
而这个点就是中位数,它实在是太优美,太巧妙了,而且不少其他问题也能用的上,接下来要证明它。
证明:给定数轴上的n个点,在数轴上的所有点中,中位数离所有顶点的距离之和最小。
在有6个点的数轴上,任取一点,比如最左边和最右边点的中点K,它的左边有4个点,右边有2个点。把它往左移一点,不要移太多,以免碰到输入点。假设移动的d单位距离,则这个点K左边4个点到它的距离各减少了d,右边的2个点到它的距离各增加了d,但总的来说,距离之和减少了2d。如果K的左边有2个点,右边有4个点,道理类似,不过应该向右移动。
换句话说,只要灰点左右的输入点不一样多,就不是最优解。所以,如果输入点一共有奇数个,则灰点必须和中间的那个点重合(中位数);如果有偶数个,则灰点可以位于最中间两个点之间的任意位置(还是中位数)。
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn = + ;
long long A[maxn], C[maxn], tot, M;
int main() {
int n;
while(scanf("%d", &n) == ) { // 输入数据大,scanf比cin快
tot = ;
for(int i = ; i <= n; i++) { scanf("%lld", &A[i]); tot += A[i]; } // 用%lld输入long long
M = tot / n;
C[] = ;
for(int i = ; i < n; i++) C[i] = C[i-] + A[i] - M; // 递推C数组
sort(C, C+n);
long long x1 = C[n/], ans = ; // 计算x1
for(int i = ; i < n; i++) ans += abs(x1 - C[i]);
// 把x1代入,计算转手的总金币数
printf("%lld\n", ans);
}
return ;
}
另外%lld这个占位符不是跨平台的。虽然cin/cout没有这个问题,但是本题输入量比较大,cin/cout会比较慢。
UVA 11300 Spreading the Wealth (数学推导 中位数)的更多相关文章
- 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(有钱同使)
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(递推,中位数)
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<=100n <= 100n<=100 的话是可以用最小费用流来求解的. 但是题中 nnn 最大可达到 10610^6106, 这就需要我们 ...
随机推荐
- 只需三步:使用C# 操作 Azure 队列
Step 1 : 安装windows Azure package Step 2 : 配置文件增加: <appSettings> <add key="StorageConne ...
- HW5.2
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- HW4.45
public class Solution { public static void main(String[] args) { int count = 0; for(int i = 1; i < ...
- Windows下使用GCC编译器
1.GCC编译器的选择 Windows下最常见的安装GCC的方式有两种:Cygwin和MinGW.本文主要介绍MinGW的安装配置. 2.下载MinGW 下载地址:http://sourceforge ...
- Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序
Robocopy是微软Windows Server 2003资源工具包中众多多用途的实用程序之一(它是基于强大的拷贝程序).没错,Robocopy的功能是拷贝文件,你也许会觉得无聊并且要翻阅下一篇文章 ...
- 利用gdb 调试android jni c动态库
http://blog.dornea.nu/2015/07/01/debugging-android-native-shared-libraries/ Since I haven't done thi ...
- devexpress中gridcontrol 一些样式改变
改变footer为扁平化效果 整个footer背景色CustomDrawFootere.Appearance.BackColor = Color.Transparent; e.Appearance.D ...
- 如何使用iframe实现隐藏的CSRF
1.攻击者在“页面1”中http://www.b.com/indexb.html中写下如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- Dom4J对XML的创建、修改、删除等操作
Dom4j也可以很方便完成XML文档的创建.元素的修改.文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好. # 准备 首先,提供相关的jar包 ...
- IP地址的分类——a,b,c 类是怎样划分的
如今的IP网络使用32位地址,以点分十进制表示,如172.16.0.0.地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址. IP地址类型 最初设计互联网络时,为了便 ...