Description

  有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input

  第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的
糖果的颗数.

Output

  求使所有人获得均等糖果的最小代价。

Sample Input

4
1
2
5
4

Sample Output

4

题解:

  膜黄学长。

  首先求出平均数$p$,然后设$x_{i}$表示第i个人要给第$i-1(MOD)n$个人糖果的数量,然后得到$n$个形如$p==a_{i}-x_{i}+x_{i+1}$的方程。

  全部展开就是:

  $$p==a_{1}-x_{1}+x_{2}\rightarrow x_{2}==p-a_{1}+x_{1}$$

  $$p==a_{2}-x_{2}+x_{3}\rightarrow x_{3}==2p-a_{1}-a_{2}+x_{1}$$

  $$...$$

  $$p==a_{n}-x_{n}+x{1}\rightarrow x_{1}==x_{1}$$

  此时我们设$f_{i}=\sum_{x=1}^{i-1}a_{i}-(i-1)p$,上面的方程就可以写作:

  $$x_{2}==x_{1}-f_{2}$$

  $$x_{3}==x_{1}-f_{3}$$

  $$...$$

  $$x_{1}==x_{1}$$

  所以$ans=\sum_{i=1}^{n}|x_{i}|=\sum_{i=1}^{n}|x_{1}-f_{i}|$。

  将其转化到数轴上就是求一个点$x_{1}$,使此点距离所有的$f_{i}$之和最小。

  然后思考,将$f$排序,假设$f_{i}<=x_{1}<=f_{i+1},i\in[1,n]$(显然我们可以知道,$x_{1}$小于或大于$f$极值是不优的)。

  那么我们可以将$f$数组从i这个位置分成两部分。

  我们先假设$i<\frac{n}{2}$($i>\frac{n}{2}$可以类比)。

  $$ans=\sum_{j=1}^{i}(f_{n-j+1}-f_{x})+\sum_{j=i+1}^{n-i}f_{j}-x_{1}$$

  再化简一下就是:

  $$ans=\sum_{j=1}^{\frac{n}{2}}(f_{n-j+1}-f_{j})+\sum_{j=i+1}^{\frac{n}{2}}2(f_{i}-x_{1})$$

  然后就显然了,当我们让后面的最小时,答案最小。

  所以时,答案最小。

  记得开long long。

#include<cstdio>
#include<algorithm>
;
inline int read(){
,k;char ch=getchar();
:k,ch=getchar();
),ch=getchar();
  return s*k;
}
int n;
int a[N],f[N];
?x:-x;}
int main(){
  n=read();
;
;i<=n;i++){
    tot+=(a[i]=read());
  }
  tot/=n;
  f[];
;i<=n;i++)
  f[i]]-tot+a[i];
,f);
)];
;
;i<=n;i++)
  ans+=abs(f[i]-mid);
  printf("%lld\n",ans);
}

【bzoj1045】【HAOI2008】 糖果传递的更多相关文章

  1. bzoj1045: [HAOI2008] 糖果传递(数论)

    1045: [HAOI2008] 糖果传递 题目:传送门(双倍经验3293) 题解: 一开始想着DP贪心一顿乱搞,结果就GG了 十分感谢hzwer大佬写的毒瘤数论题解: 首先,最终每个小朋友的糖果数量 ...

  2. bzoj3293 [Cqoi2011]分金币&&bzoj1045 [HAOI2008]糖果传递

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

  3. BZOJ1045 [HAOI2008] 糖果传递

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=987654321,表示小朋友的个数 ...

  4. [BZOJ1045] [HAOI2008] 糖果传递 (贪心)

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n<=,表示小朋友的个数.接下来n行,每行 ...

  5. [BZOJ1045][HAOI2008]糖果传递 (环形均分纸牌)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 把|s[i]-s[k]|求和即可,s[i]是A的前缀和 s[k]为s数组的中位数时,总值 ...

  6. BZOJ1045 HAOI2008糖果传递(贪心)

    显然最后每个小朋友所拥有的糖果数就是糖果数总和的平均数.设该平均数为t. 环的问题一般断成链,但这个题似乎没有什么很好的办法在枚举断点的时候快速算出答案(我甚至不知道会不会有断点) 于是我们假装把他断 ...

  7. BZOJ1045 [HAOI2008]糖果传递 && BZOJ3293 [Cqoi2011]分金币

    Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...

  8. 【贪心】bzoj1045: [HAOI2008] 糖果传递

    很妙的贪心思考过程 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'0 ...

  9. bzoj1045: [HAOI2008] 糖果传递(思维题)

    首先每个人一定分到的糖果都是所有糖果的平均数ave. 设第i个人给i-1个人Xi个糖果,则有Ai-Xi+X(i+1)=ave. 则A1-X1+X2=ave,A2-X2+X3=ave,A3-X3+X4= ...

  10. (洛谷P2512||bzoj1045) [HAOI2008]糖果传递 || 洛谷P4016 负载平衡问题 || UVA11300 Spreading the Wealth || (洛谷P3156||bzoj3293) [CQOI2011]分金币

    bzoj1045 洛谷P4016 洛谷P2512 bzoj3293 洛谷P3156 题解:https://www.luogu.org/blog/LittleRewriter/solution-p251 ...

随机推荐

  1. CentOS 7 下安装mosquitto

    简介 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把 ...

  2. 《转》iOS 平台 Cocos2d-x 项目接入新浪微博 SDK 的坑

    最近在做一个 iOS 的 cocos2d-x 项目接入新浪微博 SDK 的时候被“坑”了,最后终于顺利的解决了.发现网上也有不少人遇到一样的问题,但是能找到的数量有限的解决办法写得都不详细,很难让人理 ...

  3. 移动 Web 的用户界面设计

    http://www.ibm.com/developerworks/cn/mobile/wa-interface/index.html 简介 在创新者试图探索新的可能性的同时,新兴技术也在经历快速变化 ...

  4. C++负数取模

    预习: r=余数 a=被除数 b=除数 c=商 a/b=c........r r=a-(a/b)*b 一.下面的题目你能全做对吗?1.7/4=?2.7/(-4)=?3.7%4=?4.7%(-4)=?5 ...

  5. SOFA 源码分析 — 预热权重

    前言 SOFA-RPC 支持根据权重对服务进行预热功能,具体地址:预热权重. 引用官方文档: 预热权重功能让客户端机器能够根据服务端的相应权重进行流量的分发.该功能也常被用于集群内少数机器的启动场景. ...

  6. Java面向对象(一、封装)

    Java 封装 封装的概念 在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码 ...

  7. .NET开发微信小程序-生成二维码

    1.生成小程序二维码功能 直接请求相应的链接.传递相应的参数 以生成商铺的付款码为例: var shopsId = e.ShopsId //付款码的参数 var codeModel = new fun ...

  8. React从入门到放弃之前奏(1):webpack4简介

    接触webpack是好久之前的事情了,最近看了下webpack没想到都到4了. webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 会创建1个 ...

  9. Spring @Conditional注解的使用

    Spring Boot的强大之处在于使用了Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置. 下面来介绍如何使用Condition 首先写一个类 ...

  10. Oracle-11:联合查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 联合查询的实际上的意义就是从俩个结果集中拿有特定联系的结果封装为一个结果集 数据库脚本给放一份,供测试使用 c ...