题意:
      圆桌旁作者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 分金币(中位数)

    来源:https://vjudge.net/problem/UVA-11300 题意: 有n个人围成一圈,每个人有一定数量的金币,每次只能挪动一个位置,求挪动的最少金币使他们平分金币 题解: 蓝书p6 ...

  2. 分金币 bzoj 3293

    分金币(1s 128M)  coin [问题描述] 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的 ...

  3. 【BZOJ-3293&1465&1045】分金币&糖果传递×2 中位数 + 乱搞

    3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 854  Solved: 476[Submit][Status] ...

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

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  5. 【BZOJ3293】分金币(贪心)

    [BZOJ3293]分金币(贪心) 题面 BZOJ 洛谷 题解 和上一题一样啊. #include<cstdio> #include<cmath> #include<al ...

  6. BZOJ3293: [Cqoi2011]分金币(数学)

    3293: [Cqoi2011]分金币 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1596  Solved: 969[Submit][Status ...

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

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

  8. Java实现蓝桥杯分金币

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

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

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

随机推荐

  1. ELK----elasticsearch7.10.1安装配置

    环境: vmware centos7 1.下载适合自己的es版本 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-1 ...

  2. 使用Spark加载数据到SQL Server列存储表

    原文地址https://devblogs.microsoft.com/azure-sql/partitioning-on-spark-fast-loading-clustered-columnstor ...

  3. 不用代码趣讲 ZooKeeper 集群

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 项 ...

  4. C# 应用 - 使用 WebClient 发起 Http 请求

    1. 需要的库类 \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.2\System.dll System.Net.WebCli ...

  5. [ONTAK2010] Peaks 加强版

    [ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...

  6. 从yield到yield from再到python协程

    yield 关键字 def fib(): a,b = 0,1 while 1: yield b a,b = b,a+b yield是在:PEP 255 -- Simple Generators 这个p ...

  7. Spring Native 项目,把 Spring 项目编译成原生程序!

    Spring Native 是什么 优点 缺点 原生镜像(native image)和常规 JVM 程序的区别 前置条件:GraalVM 支持的语言 关键特性 GraalVM 下的 Java 微服务 ...

  8. java例题_03 水仙花数

    1 /*3 [程序 3 水仙花数] 2 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 3 例如:153 是一个 ...

  9. Java中的面向切面编程(AOP)

    一.什么是AOP? Aspect Oriented Programming ,即面向切面编程. AOP是对面向对象编程的一个补充. 它的目的是将复杂的需求分解为不同的切面,将散布在系统中的公共功能集中 ...

  10. 快速上手阿里云oss SDK

    使用阿里云oss SDK 依赖安装: pip install oss2 pip install aliyun-python-sdk-sts 版本最好是 2.7.5 或以上 如果要开启 crc64 循环 ...