题目描述

有\(n(n<1000000)\)个小朋友坐成一圈,每人有\(a_i\)个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为\(1\),求使所有人糖果数相等的最小代价。

暴力的做法比较显然,有\(30\)分,这里就不再赘述了。

推一波式子:先考虑一条链的情况,\(a[i]\)为原数组,\(b[i]\)为\(a[i]\)每项分别减掉平均数的数组,\(sum1[i],sum2[i]\)分别为\(a[i],b[i]\)的前缀和数组,\(ave\)为平均数。则\(ans\)可表示为\(\sum\limits_{i=1}^{n}|i*ave-sum1[i]|\),再化简得到\(\sum\limits_{i=1}^{n}|sum2[i]|\)。然后是环形的情况,断环为链的位置不同,会变化的量就是前缀和数组。假设断环的位置为\(p\),则前缀和变为\(sum2[k+1]-sum2[k],sum2[k+2]-sum2[k]...\),减掉重复部分就是\(sum2[k]-sum2[1],sum2[k]-sum2[2]...\),所以答案就是\(\sum\limits_{i=1}^{n}|sum2[k]-sum2[i]|\),结论就是\(sum2[k]\)为中位数时是最优的(证明以后再补吧)。照着式子写代码就好了。

#include <cstdio>
#include <algorithm> using namespace std; #define N 1000000 int n;
long long sum[N+5], ave; int main() {
scanf("%d", &n);
long long t, ans = 0;
for(int i = 1; i <= n; ++i) scanf("%lld", &t), ave += t, sum[i] = sum[i-1]+t;
ave /= n;
for(int i = 1; i <= n; ++i) sum[i] -= i*ave;
nth_element(sum+1, sum+(n+1)/2, sum+n+1);
for(int i = 1; i <= n; ++i) ans += abs(sum[(n+1)/2]-sum[i]);
printf("%lld", ans);
return 0;
}

[HAOI2008]糖果传递 结论题的更多相关文章

  1. BZOJ 1045: [HAOI2008] 糖果传递 数学

    1045: [HAOI2008] 糖果传递 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1045 Description 有n个小朋友坐 ...

  2. 【BZOJ 1045】 1045: [HAOI2008] 糖果传递

    1045: [HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数n& ...

  3. bzoj 1045: [HAOI2008] 糖果传递 贪心

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1812  Solved: 846[Submit][Stat ...

  4. P2512 [HAOI2008]糖果传递&&P3156 [CQOI2011]分金币&&P4016 负载平衡问题

    P2512 [HAOI2008]糖果传递 第一步,当然是把数据减去平均数,然后我们可以得出一串正负不等的数列 我们用sum数组存该数列的前缀和.注意sum[ n ]=0 假设为链,那么可以得出答案为a ...

  5. 【BZOJ1045】[HAOI2008]糖果传递

    [BZOJ1045][HAOI2008]糖果传递 题面 bzoj 洛谷 题解 根据题意,我们可以很容易地知道最后每个人的糖果数\(ave\) 设第\(i\)个人给第\(i-1\)个人\(X_i\)个糖 ...

  6. 【BZOJ1045】[HAOI2008] 糖果传递 贪心

    [BZOJ1045][HAOI2008] 糖果传递 Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正 ...

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

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

  8. P2512 【一本通提高篇贪心】「一本通 1.1 练习 6」[HAOI2008]糖果传递

    [HAOI2008]糖果传递 题目描述 有 n n n 个小朋友坐成一圈,每人有 a i a_i ai​ 个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为 1 1 1. 输入格式 小朋友 ...

  9. BZOJ1045 [HAOI2008] 糖果传递

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

随机推荐

  1. 01-vue学习之前的准备

    一.具备的基础知识 1.扎实的HTML/CSS/Javascript基本功,这是前置条件. 2.不要用任何的构建项目工具,只用最简单的<script>,把教程里的例子模仿一遍,理解用法.不 ...

  2. MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

      关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别 ...

  3. GenericServlet 、Servlet和httpServler

    -------[转] 1.GenericServlet类是所有Servlet类的祖先类. 2.HttpServlet类继承了GenericServlet类. 3.Servlet有两个非常重要的的对象, ...

  4. C 存储类

    存储类定义 C 程序中变量/函数的范围(可见性)和生命周期.这些说明符放置在它们所修饰的类型之前.下面列出 C 程序中可用的存储类: auto.register.static.extern auto ...

  5. 指定IP地址进行远程访问服务器设置方法(windows系统)

    我们有很多服务器经常受到外界网络的干扰,入侵者们通过扫描3389端口爆破密码非法进入我们的服务器,这时,我们可以配置服务器IP 安全策略来限制一些IP访问,大大提高了服务器的安全. 实验环境:     ...

  6. vi命令下常用命令

    dd:删除游标所在的一整行(常用)ndd:n为数字.删除光标所在的向下n行,例如20dd则是删除光标所在的向下20行d1G:删除光标所在到第一行的所有数据dG:删除光标所在到最后一行的所有数据d$:删 ...

  7. Django的认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  8. CentOS7.4使用KVM

    参考地址 [root@node1 ~]# cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) [root@node1 ~]# un ...

  9. Java Lucene入门

    1.lucene版本:7.2.1 pom文件: <?xml version="1.0" encoding="UTF-8"?> <project ...

  10. Python-序列号和模块复习-64

    # 序列化模块 # 数据类型转化成字符串的过程就是序列化 # 为了方便存储和网络传输 # json # dumps # loads # dump 和文件有关 # load load不能load多次 i ...