[ACM_几何] UVA 11300 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
Problem setter: Josh Bao
题目大意:n人围绕圆桌,每个人有一定数量金币,金币总数能被n整除。每个人可以给他左右的人一些金币,最终使每个人金币数相等。求被转手金币最小值。
解题思路:
1、列出方程组:
设Ai为初始金币数,xi表示i号给i-1号金币数[可正可负],M为最终每个人的金币数,则:
for the first person: A1-x1+x2=M-->x2=M-A1+x1=x1-C1[规定C1=A1-M]
for the second person: A2-x2+x3=M-->x3=M-A2+x2=2M-A1-A2+x1=x1-C2
for the third person: A3-x3+x4=M-->x4=M-A3+x3=3M-A1-A2-A3+x1=x1-C3
......
for the nth person: An-xn+x1=M[这是一个多余的式子,并不能给我们更多的信息]
2、转换为单变量问题:
我们希望所有xi的绝对值之和最小,即:|x1|+|x1-C1|+|x1-C2|+...+|x1-Cn|最小。
3、转换为几何问题:
注意上式的几何意义就是数轴上给定n个点找出一个到他们之和尽量小的点。
4、递归求最优解:
这个最优的x1就是他们的中位数。
#include<iostream>
#include<algorithm>
#include<cstdio>
typedef long long LL;
using namespace std;
LL A[],C[];//A[i]表示第i人初始金币数
int main(){
int n;
while(cin>>n){
LL tot=;//总数
for(int i=;i<n;i++){
cin>>A[i];
tot+=A[i];
}
LL M=tot/n;//平均数
C[]=;
for(int i=;i<n;i++){
C[i]=C[i-]+A[i]-M;//递推数组C
}
sort(C,C+n);
LL x1=C[n/],ans=;//计算x1
for(int i=;i<n;i++){
ans+=abs(x1-C[i]);
}
cout<<ans<<'\n';
}return ;
}
[ACM_几何] UVA 11300 Spreading the Wealth [分金币 左右给 最终相等 方程组 中位数]的更多相关文章
- UVa 11300 Spreading the Wealth 分金币
圆桌旁坐着 n 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...
- 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 (思维题 中位数模型)
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 ...
随机推荐
- asp.net前台绑定时间格式时,定义时间格式
<%#Eval("news_time","{0:yyyy-MM-dd}") %><%#((DateTime)Eval("news_t ...
- VC++绘图时,利用双缓冲解决屏幕闪烁 转载
最近做中国象棋,绘制界面时遇到些问题,绘图过程中屏幕闪烁,估计都会想到利用双缓冲来解决问题,但查了下网上双缓冲的资料,发现基本是MFC的,转化为VC++后,大概代码如下: void DrawBmp(H ...
- HDU 2222 Keywords Search(AC自动机入门)
题意:给出若干个单词和一段文本,问有多少个单词出现在其中.如果两个单词是相同的,得算两个单词的贡献. 分析:直接就是AC自动机的模板了. 具体见代码: #include <stdio.h> ...
- 三天没有写题了,罪过!--Hash Table Start
(1)Island Perimeter 解题思路: 在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 ...
- nullcon HackIM2016 -- Programming Question 3
Still Hungry and unsutisfied, you are looking for more. Some more, unique un heard dishes. Then you ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- setTimeout注意事项
<script type="text/javascript"> function show(v){ alert(v); } func ...
- swift 定制自己的Button样式
swift的UIButton类中有些公开方法可以重写,所以,如果想写出自己的UIButton,只要继承UIButton类,并重写相应的方法即可. 系统的UIButton可以添加图片,也可以添加标题,但 ...
- 利用iframe无刷新上传文件的坑
页面里经常要用到文件上传的功能,而且要求页面不刷新,先说一下原理:页面里放一个file控件和submit按钮,外面用form表单包住,给form表单加上对应的属性值,action.method.ent ...
- php 继承
说多重继承之前首先说下与其相对的单一继承,单一继承指的是一个类只可以继承自一个父类,从现实生活中举例就是说一个儿子只有一个父亲.那么多重继承就好理解了,多重继承指的是一个类可以同时从多于一个父类继承行 ...