分金币

原创 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);
    }
}


算法 分金币

圆桌旁坐着n个人,每人有一定数量的金币,金币总数总能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数相等,你的任务是求出被转手的金币数量的最小值。 输入第一行为整数n(n 对于...
  • try_fei_ge
  • try_fei_ge
  • 2017年06月14日 22:32
  • 394

海盗瓜分金币--一道网上流传的微软面试题

在一个孤岛上有5个海盗要瓜分100块金币.他们按下列方法来瓜分这些掠夺物:资格最老的海盗提出一个分配意见,然后大家对这个分配意见投票表决.如果有一半的人投了赞成票,就按照这个方案来划分.如果没有通过,...
  • fisher_jiang
  • fisher_jiang
  • 2006年08月28日 17:31
  • 2816

算法入门之分金币(求极值)

圆桌旁边有n个人,每个人有一定数量的金币,每个人可以给他左右相邻的人一些金币,最终使每个人的金币数量相等,求出被转手的金币的最小数量 #include #include #include #i...
  • u011470356
  • u011470356
  • 2014年01月19日 17:08
  • 523

【BZOJ 3293】 [Cqoi2011]分金币

经典问题~
  • Regina8023
  • Regina8023
  • 2015年04月20日 08:22
  • 1142

BZOJ 3293/1465/1045([Cqoi2011]分金币/糖果传递/[HAOI2008] 糖果传递-列方程)

圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除。每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等。你的任务是求出被转手的金币数量的最小值。经典问题 设第一个人给第二个人x...
  • nike0good
  • nike0good
  • 2016年08月31日 03:09
  • 269

第五届蓝桥杯软件类决赛真题-C-A-1_海盗分金币

/*【题目】 标题:海盗分金币     有5个海盗,相约进行一次帆船比赛。     比赛中天气发生突变,他们被冲散了。     恰巧,他们都先后经过途中的一个无...
  • Chen_Tongsheng
  • Chen_Tongsheng
  • 2016年11月28日 10:52
  • 436

5个海盗分100个金币

5个海盗抢到了100金币,他们决定这分: 1. 抽签决定自己的号码(1,2,3,4,5) 2. 首先,由1号提出分配方案,然后大家5人进行表决,当且仅当超过半数的人同意时,按照他的提案进行分配,否则将...
  • hbjiaxiaoxue
  • hbjiaxiaoxue
  • 2013年10月09日 21:39
  • 2138

5个海盗,分100个金币

五位绝顶聪明、勇敢、理智、果断干练的女海盗抢得100枚金币后,讨论如何进行公正分配。他们商定的分配原则是:   (1)抽签确定各人的分配顺序号码(1,2,3,4,5);   (2)由抽到1号签的女...
  • u012543601
  • u012543601
  • 2014年05月09日 11:07
  • 1556

【算法设计与分析】分金币

【题目】 【输入输出要求】 【输出样例】 【源代码】 //中位数问题 #include #include int m[1000001],p[1000001]; int ...
  • LDan508
  • LDan508
  • 2016年06月30日 16:53
  • 512

PAT 2-10 海盗分赃(C语言实现)

题目描述: P个海盗偷了D颗钻石后来到公海分赃,一致同意如下分赃策略: 首先,P个海盗通过抽签决定1-P的序号。然后由第1号海盗提出一个分配方案(方案应给出每个海盗分得的具体数量),如...
  • wutongyu0113
  • wutongyu0113
  • 2014年10月02日 21:01
  • 789
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分金币
举报原因:
原因补充:

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