bzoj3293[Cqoi2011]分金币

Description

圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。

Input

第一行为整数nn>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥有的金币数。

Output

输出被转手金币数量的最小值。

Sample Input

4

1

2

5

4

Sample Output

4

样例解释

设四个人编号为1,2,3,4。第3个人给第2个人2个金币(变成1,4,3,4),第2个人和第4个人分别给第1个人1个金币。

HINT

N<=<=100000,总金币数<=10^9

可以发现只要确定了n给1的金币数,就可以确定所有人之间给的金币数,设n给1的金币数为x,写出总金币数关于x的函数,是一个绝对值函数,有几何意义,一个是一个初中就会的简单求最值,取中位数作为x就是最小值。

 1 program coin(input,output);
 2 var
 3   a,b:array[0..100010]of int64;
 4   n,i:longint;
 5   c,t,ans:int64;
 6 procedure sort(q,h:longint);
 7 var
 8   i,j:longint;
 9   x,t:int64;
10 begin
11    i:=q;j:=h;x:=b[(i+j)>>1];
12    repeat
13      while b[i]<x do inc(i);
14      while x<b[j] do dec(j);
15      if i<=j then
16         begin
17            t:=b[i];b[i]:=b[j];b[j]:=t;
18            inc(i);dec(j);
19         end;
20    until i>j;
21    if j>q then sort(q,j);
22    if i<h then sort(i,h);
23 end;
24 begin
25    assign(input,‘coin.in‘);assign(output,‘coin.out‘);reset(input);rewrite(output);
26    readln(n);
27    c:=0;
28    for i:=1 to n do begin readln(a[i]);c:=c+a[i]; end;
29    c:=c div n;
30    b[1]:=0;
31    for i:=2 to n do b[i]:=b[i-1]+c-a[i-1];
32    sort(1,n);
33    t:=b[(1+n)>>1];ans:=0;
34    for i:=1 to n do ans:=ans+abs(t-b[i]);
35    write(ans);
36    close(input);close(output);
37 end.
时间: 2025-01-15 16:36:42

bzoj3293[Cqoi2011]分金币的相关文章

[BZOJ3293] [Cqoi2011] 分金币 (贪心)

Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Input 第一行为整数n(n>=3),以下n行每行一个正整数,按逆时针顺序给出每个人拥有的金币数. Output 输出被转手金币数量的最小值. Sample Input 4 1 2 5 4 Sample Output 4 样例解释 设四个人编号为1,2,3,4.第3个人给第2个人2个金币(变成1,4,3,

【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行每行一个正整数,按逆时针顺序给出每个人拥

P2512 [HAOI2008]糖果传递&amp;&amp;P3156 [CQOI2011]分金币&amp;&amp;P4016 负载平衡问题

P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为abs( sum[ 1 ] )+abs( sum[ 2 ] )+...+abs( sum[ n ] ) 但是题目说的是环 我们设在第 k 个人处断开环成链. 那么答案为 abs( sum[ k+1 ] - sum[ k ] )+abs( sum[ k+2 ] - sum[ k ] )+...+abs(

【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行每行一个正整数,按逆时针顺序给出每个人拥

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

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

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

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

分金币

分金币 题目描述: ? 圆桌旁坐着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 分金币

链接:https://uva.onlinejudge.org/index.php?///option=com_onlinejudge&Itemid=8&page=show_problem&problem=2275刚开始看到这题目,我是没什么想法的,没想到书上的技巧看起来如此的简单假设M为每个人都拥有的金币数,每个人的金币变化是左右相邻的人对其造成的影响假设这n个人构成一个环,先假设n=4,设x1指1号给4号多少金币,则x2代表2号给1号多少金币,其他的由此类推下去.则对于1号来说,

分金币 Uva 11300

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