UVA 11300 分金币

链接:https://uva.onlinejudge.org/index.php?///option=com_onlinejudge&Itemid=8&pa
ge=show_problem&problem=2275
刚开始看到这题目,我是没什么想法的,没想到书上的技巧看起来如此的简单
假设M为每个人都拥有的金币数,每个人的金币变化是左右相邻的人对其造成的影响
假设这n个人构成一个环,先假设n=4,设x1指1号给4号多少金币,则x2代表2号给1号
多少金币,其他的由此类推下去。
则对于1号来说,他给了4号金币,则剩a1-x1
2号给了他金币,则剩a1-x1+x2
注意这里1号给4号和4号给1号的意义隐含在x1的符号里面(很巧妙),其他的类似
由于最后要等于M,然后就可以得方程了
a1-x1+x2=M >> x2 = x1-(a1-M) = x1 - C1
a2-x2+x3=M >> x3 = x2-(a2-M)=x1-a1-a2-2*M = x1 - C2
a3-x3+x4=M >> x4 = x3-a1-a2-a3-3*M = x1 - C3
an-xn+x1=M >> xn = x1 - C(n-1)
看到这里我们知道答案是所有xi的绝对值最小了
很显然这就转化为数轴上求一点x到ci距离和的最小值,然而这个点x其实就是序列ci(排 
序后)的中位数,稍微想想应该知道
中位数可以用到许多此模型的题上
看起来那么复杂,最后却如此简单,数学的强大力量
代码如下:

 1 #include<cstdio>
 2 #include<math.h>
 3 #include<vector>
 4 #include<algorithm>
 5 #define LL long long
 6 using namespace std;
 7
 8 const int maxn = 1e6+10;
 9 LL c[maxn];
10 int main()
11 {
12     int n;
13     LL a,sum,M;
14     while(scanf("%d",&n)==1)
15     {
16         sum = 0;
17         c[0] = 0;
18         for(int i = 1; i<=n; i++)
19         {
20             scanf("%lld",&a);
21             c[i] = c[i-1] + a;
22             sum += a;
23         }
24         M = sum / n;
25         for(int i = 1; i<n; i++) c[i] -= i*M;
26         sort(c,c + n);
27         LL x1 = c[n/2] , ans = 0;
28         for(int i = 0; i<n; i++) ans += abs(x1-c[i]);
29         printf("%lld\n",ans);
30
31     }
32     return 0;
时间: 2024-10-01 04:51:23

UVA 11300 分金币的相关文章

数学/思维 UVA 11300 Spreading the Wealth

题目传送门 1 /* 2 假设x1为1号给n号的金币数(逆时针),下面类似 3 a[1] - x1 + x2 = m(平均数) 得x2 = x1 + m - a[1] = x1 - c1; //规定c1 = a[1] - m,下面类似 4 a[2] - x2 + x3 = m ,x3 = m + x2 - a[2] = m + (m + x1 - a[1]) - a[2] = 2 * m + x1 - a[1] - a[2] = x1 - c2; 5 a[3] - x3 + x4 = m ,x4

Uva 11300 Spreading the Wealth 中位数

UVA - 11300 Spreading the Wealth Description A Communist regime is trying to redistribute wealth in a village. They have have decided to sit everyonearound a circular table. First, everyone has converted all of their properties to coins of equal valu

HDU 1538 A Puzzle for Pirates 经典海盗分金币

题目:这是一个经典问题,有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续. 首先我们讲一下海盗分金决策的三个标准:保命,拿更多的金子,杀人,优先级是递减的. 同时分为两个状态稳定状态和不稳定状态:如果当n和m的组合使得最先决策的人(编号为n)不会被丢下海, 即游戏会立即结束, 就称这个状态时"稳定的". 反之, 问题会退化为n-1和m的组合, 直到达到一个稳定状态, 所以乘

【BZOJ 3293】 [Cqoi2011]分金币

3293: [Cqoi2011]分金币 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 651 Solved: 345 [Submit][Status][Discuss] Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥

【BZOJ-3293&amp;1465&amp;1045】分金币&amp;糖果传递&#215;2 中位数 + 乱搞

3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status][Discuss] Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥

博弈故事一则——海盗分金币问题

话说一天有5个海盗抢了一艘who的游轮,抢到了100枚金币,但这5个人没有老大,不知道怎么分这100枚金币.不过5个人都绝顶聪明,他们决定:1,抽签,决定12345五个号码,2,由1号提分配方案,大家一起举手表决,超过半数同意则通过:否则被扔进大海里喂鲨鱼:3,1号死了由2号提分配方案,四个人表决有超过半数人同意,则通过,否则仍旧被扔进大海里喂鲨鱼:4,以此类推----- 假定:每个海盗都是一样的聪明,没有谁比谁笨,都很理智可以 做出理性的决策,那么1号如何决策才能使自己的收益最大且当然不会被扔

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

分金币

分金币 题目描述: ? 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数相等.你的任务是求出被转手的金币数量的最小值.比如,n=4,且4个人的金币数分别为1,2,5,4时,只需转移4枚金币(第3个人给第2个人两枚金币,第2个人和第4个人分别给第1 个人1枚金币)即可实现每人手中的金币数目相等. Input: ? 输入包含多组数据.每组数据第一行为整数n(n<=1 000 000),以下n行每行为一个整数,按逆时针顺序给出每个人

分金币 Uva 11300

题意 给定N个人成环状坐,每个人初始分配Ai的金币,金币总数可以被N整除,每个人可以给左右相邻的人一定数量的金币使得最终每个人的金币数量相同,求转移数量最小的方案所转移的总金币数量. N<=1000000 对每组数据保证输出在INT64范围之内. 1.最终每个人拥有的金币可以直接确定,设为M 2.设xi表示第i个人从上一个人手中获得的金币,若为负则标识它会给上一个人金币,注意x1是从第n个人手中获得金币的数量 3.我们的目标是使得 |x1|  + |x2| + ... |xn| 最小,并且使它可