题意:
      圆桌旁作者n个人,每个人都有一定数量的金币,他们每次可以给相邻的人一枚金币(可以给多次),问所有人金币数都相同的话最少要给多少次金币。

思路: 
      这个题目感觉很好,首先我们可以假设每个人都向他前面的人给出了xi的金币,x1表示1这个人给了n这个人(因为是环)多少金币,x2表示2给了以多少金币,xi可以使负数,负数说明是反着给的x2=-4说明是一给了二4枚金币,这样我们就可以列出来一些方程组了
,假设M是平均数,Ai表示第i个人的金币数,那么有

A1-x1+x2=M  ->               x2=x1-(A1-M)= x1-C1   设C1=A1-M
A2-x2+x3=M  ->x3 = x2-(A2-M)=x1-C1-(A2-M)= x1-C2   设C2=(A1-M)+(A2-M)
同理                                   x3= x1-C3   设C3= (A1-M)+(A2-M)+(A3-M)
我们用含有A1的式子推出x2,用含有A2的退出x3...所以我们没有必要用最后一个式子,还有一点就是 x1 = x1 - C0 那么C0=0;
这样推到之后就变成我们是要求 |x1| + |x1-C1| + |x2-C2|......
那么把他们和一维坐标联系起来,是不是就是求所有点到x1点(Ci构成的点)的距离和的最小值了,这样我们只要求出x1就行了,其实这个x1就是所有C的中位数,为什么是这样这个很好理解,我们可以在纸上画一画,比如当前的x1左边有4个点,右边有5个点,那么把x1向右移动一小块距离d(不要跨过右边的点)我们会发现整体是左边增加4d,右边减少5d所以我们要往左移,不能往右移,最后奇数的情况就是中间的那个数最优(中位数),偶数的时候是中间的那两个之间的位置(包括中间的那两个)的区间都是最优的,还可以用中位数表示。

#include<stdio.h>
#include<algorithm>

#define N 1000000 + 10

using namespace std;

long long num[N];
long long C[N];

long long abss(long long x)
{
   return x > 0 ? x : -x;
}

int main ()
{
   int n ,i;
   long long Ans ,Sum ,M;
   while(~scanf("%d" ,&n))
   {
      for(Sum = 0 ,i = 1 ;i <= n ;i ++)
      {
         scanf("%lld" ,&num[i]);
         Sum += num[i];
      }
      M = Sum / n;
      C[0] = 0;
      for(i = 1 ;i < n ;i ++)
      C[i] = C[i-1] + num[i] - M;
      sort(C ,C + n);
      long long x1 = C[n/2];
      for(Ans = 0 ,i = 0 ;i < n ;i ++)
      Ans += abss(x1 - C[i]);
      printf("%lld\n" ,Ans);
   }
   return 0;
}

UVA11300分金币相关推荐

  1. 《训练指南》中的“突击战”和分金币问题

    又到了周末,发现很堕落啊,眼看都星期天了,赶紧发一篇文章,总结一下上周学的. 原题见UVA11300,Spreading the wealth,和 UVA 11729 Commando War:先说突 ...

  2. cogs 1430. [UVa 11300]分金币

    1430. [UVa 11300]分金币 ★☆   输入文件:Wealth.in   输出文件:Wealth.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 圆桌旁坐 ...

  3. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第一题:海盗分金币

    标题:海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩 ...

  4. 三姬分金/四姬分金/五姬分金(海盗分金币)等经典博弈论问题

    题目: A.B.C三人分100枚金币,按顺序提议. 规则:提议未获得半数以上(不包括半数)通过,则提议人被处死. 假如你是A,你会怎么提? 从后往前推 如果只剩下B.C 无论B怎么提议,C都不会同意, ...

  5. Java实现蓝桥杯分金币

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

  6. 博弈论系列—海盗分金币

    在面试的过程中,除了常规的算法题目,我们经常也会被问到一些趣味题型来考察思维,尤其以 FLAG(Facebook, LinkedIn, Amazon, Google)等公司为典型.而这类问题的背后,很 ...

  7. 关于海盗分金币问题的讨论(面试题)[]

    在加勒比海上,有五个海盗,这些海盗都是十分聪明且贪婪的,他们共同抢到了100枚金币, 每一个人按顺序依次提出自己的分配方案,如果提出的方案没有获得半数或半数以上的人的同意,则这个提出方案的人就被扔到海 ...

  8. 算法逻辑题-海盗分金币问题

    有5个海盗,获得了100枚金币,他们约定一个分配方案. 商议方式:1.有5个海盗轮流提出分配方案                 2.如果超出半数海盗(包括提出者)同意该方案,则按照该方案分配    ...

  9. java实现第五届蓝桥杯海盗分金币

    海盗分金币 有5个海盗,相约进行一次帆船比赛. 比赛中天气发生突变,他们被冲散了. 恰巧,他们都先后经过途中的一个无名的荒岛,并且每个人都信心满满,觉得自己是第一个经过该岛的人. 第一个人在沙滩上发现 ...

最新文章

  1. IOS工程自动打包并发布脚本实现
  2. Vue3学习笔记01:使用NPM方法安装Vue3
  3. 数据结构笔记(一) 线性表(C语言描述)
  4. 如何在Unity项目中添加语音识别?
  5. codeforces 597C (树状数组+DP)
  6. next数组_数据结构之数组与链表
  7. MySql数据恢复方法个人总结
  8. 正则表达式在线测试 | 菜鸟工具
  9. apkmirror_how to download your app from apkmirror to get the lastest app version
  10. 主流大数据存储解决方案评析
  11. 1813 句子相似性 III
  12. JavaWeb专栏之(三):Eclipse创建JavaWeb项目
  13. Mysql.索引存储结构演进(面试一次搞定)
  14. matlab moveverage,MATLAB在数字图像处理课程教学中的应用
  15. 外贸用什么邮箱好,如何选择一个好用的外贸企业邮箱
  16. scrapy实例 ----- 爬取小说
  17. 4_MySQL_聚合函数和条件查询
  18. 阿里云部署metasploit framework
  19. Ubuntu18.04修改iBus输入法快捷键
  20. ulimit -c unlimited linux系统对core文件限制解除

热门文章

  1. 根据DNS的A记录负载均衡web服务请求
  2. 虚拟机里安装Linux系统出现乱码
  3. Gradle for Android 第三篇( 依赖管理 )
  4. 十亿级视频播放技术优化揭密
  5. Redis key 相关命令
  6. oracle初始安装大小
  7. 把握现在才是最重要的
  8. 上传照片表单提交包括文本框下拉条等,如何取文本框的值
  9. Android 之 ProgressDialog用法介绍(矩形进度条 和 圆形 进度条)
  10. 苹果风格:分享一组免费的自定义 MacOS 图标