分金币

原创 2013年12月02日 11:38:11

题目陈述:

  n个人围成一圈,没人手中有一定数量的硬币,硬币总和可以被 n 整除,每个人可以给左右相邻的人一些硬币,使得最后每人手中的硬币数量相等。求转手硬币数量的最小值。

解题思路:

用变量描述题目的分硬币过程,将题目转换成求中位数的算法。

假设第i个人初始有 Ai 枚硬币,最后每人得到的硬币数为 M ,给出的硬币数为 xi,把给出硬币的过程简化为单方向给出,如x1->x4->x3->x2->x1, 则可得到方程组:

A1-x1+x2=M

A2-x2+x3=M

.....

An-xn+x1=M(没用)

用 x1 分别表示 x2,x3....xn-1:

对于第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

........

我们希望所有xi的绝对值之和最小 ,即 |x1|+|x1-C1|+|x1-C2|+...+|x1-Cn-1| 最小

给定数轴上的n个点,在数轴上的所有点中,中位数离所有点的距离之和最小

最优的x1就是这些数的中位数。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#define maxn 1111111

using namespace std;

long long a[maxn];
long long b[maxn],M,sum;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            sum+=a[i];
        }
        M=sum/n;
        b[0]=0;
        for(int i=1;i<n;i++)
        {
            b[i]=b[i-1]+M-a[i];
        }
        sort(b,b+n);
        long long x=b[n/2];
        long long ans=0;
        for(int i=0;i<n;i++)
        {
            ans+=abs(x-b[i]);
        }
        printf("%lld\n",ans);
    }
}


相关文章推荐

分金币续集(微软面试题)

  • 2006年03月16日 00:00
  • 978KB
  • 下载

【cqoi2001】 分金币 自己做题时的一点思路

题目   圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除。   每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。 ...
  • Favbeer
  • Favbeer
  • 2017年07月18日 14:58
  • 55

【贪心+中位数】【UVa 11300】 分金币

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

uva 11300(分金币)

题目: A Communist regime is trying to redistribute wealth in a village. They have have decided to sit...
  • fouzhe
  • fouzhe
  • 2016年03月04日 18:49
  • 130

Spreading the Wealth (分金币)

A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever...

分金币问题---阿里巴巴2018年校招内推Java研发岗在线编程测验

分金币的问题 思路 一: 使用huffman树实现 代码: import java.util.ArrayDeque; import java.util.ArrayList; impor...

海盗分金币答案分析

船上有5个海盗,要分抢来的100枚金币。自然,这样的问题他们是由投票来解决的。投票的规则如下:先由最凶残的海盗来提出分配方案,然后大家一人一票表决,如果有50%以上的海盗同意这个方案,那么就以此方案分...

UVA11300 分金币

非常棒的一道题 看了就觉得是三分 三分第一个给第二个多少 其他的可以推出来 而时间上应该没问题  但是范围会出问题 如果是把范围订为定为 long long 的范围 中间的结果会超 所以不知道范围应该...

分金币(Spreading the Wealth, UVa 11300)

分金币Spreading the Wealth UVa 11300 分金币(Spreading the Wealth, UVa 11300)  圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整...

算法 分金币

圆桌旁坐着n个人,每人有一定数量的金币,金币总数总能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数相等,你的任务是求出被转手的金币数量的最小值。 输入第一行为整数n(n 对于...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分金币
举报原因:
原因补充:

(最多只允许输入30个字)