首先我们假设平均数为ave

那么对于第1个人,我们假设他给第N个人K个糖果,第2个人给1,第3个人给2,第n个人给第n-1个人

那么对于第1个人给完n,第2个人给完1,第一个人不会再改变糖果数了,所以应该是ave

那么第一个人原来是a1,给n之后是a1-k,代价是k,第2个人给1,使1的糖果数是ave,所以应该

给ave-a1+k个,代价是abs(ave+k-a1)=abs(a1-k-ave),那么第2个人变成了a2+a1-k-ave个

第3个人需要给2个人ave-a2-a1+k+ave=2*ave-a1-a2+k个,那么代价是

abs(2*ave-a1-a2+k)=abs(a1+a2-k-2*ave),以此类推

第n个人给第n-1个人,代价应为abs((a1+a2+……+an-1)-k-(n-1)*ave),那么第一个人给第n个人

的代价k可以看成abs((a1+a2+……+an)-k-n*ave),所以我们设sum[i]=Σ(a[j])-i*ave    j<=i

那么ans=Σ(sum[i]-k),那么sum[i]是定值,和k无关,我们可以求出来,就是求ans的最小值了,

那么k应该是sum[i]数组中的中位数,可以使ans最小

我们要找的就是sum的中位数,快排下就好了

//By BLADEVIL
var
n :longint;
a, sum :array[..] of int64;
i :longint;
ave :int64;
ans, k :int64;
procedure swap(var a,b:int64);
var
c :int64;
begin
c:=a; a:=b; b:=c;
end; procedure qs(low,high:longint);
var
i, j, xx :longint;
begin
i:=low; j:=high; xx:=sum[(i+j) div ];
while i<j do
begin
while sum[i]<xx do inc(i);
while sum[j]>xx do dec(j);
if i<=j then
begin
swap(sum[i],sum[j]);
inc(i); dec(j);
end;
end;
if i<high then qs(i,high);
if j>low then qs(low,j);
end; begin
read(n);
for i:= to n do read(a[i]);
for i:= to n do sum[i]:=sum[i-]+a[i];
ave:=sum[n] div n;
for i:= to n do sum[i]:=sum[i]-i*ave;
qs(,n);
k:=sum[(+n) div ];
for i:= to n do ans:=ans+abs(sum[i]-k);
writeln(ans);
end.

bzoj 1045糖果传递 数学贪心的更多相关文章

  1. [BZOJ]1045 糖果传递(HAOI2008)

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

  2. BZOJ 1045 糖果传递(思维)

    设第i个人给了第i+1个人mi个糖果(可以为负),因为最后每个人的糖果都会变成sum/n. 可以得到方程组 mi-mi+1=a[i+1]-sum/n.(1<=i<=n). 把方程组化为mn ...

  3. BZOJ 1045 糖果传递

    奇怪的式子.最后发现取中位数. #include<iostream> #include<cstdio> #include<cstring> #include< ...

  4. 【BZOJ1045】糖果传递(贪心)

    [BZOJ1045]糖果传递(贪心) 题面 BZOJ 洛谷 题解 秉承者娱乐精神,我们必须写一个费用流,并且相信信仰跑不过去. 于是写了一个\(zkw\)费用流如下:(您可以无视此份代码) #incl ...

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

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

  6. B1045 糖果传递 数学

    糖果传递,一开始就想到了n^2的模拟贪心算法,但是一看,数据范围太大,好像只有O(N)能过...没啥方法,只好看题解,之后发现,woc,还有这种操作? 这个题直接可以用数学证明... 证明如下: 首先 ...

  7. BZOJ-1045 糖果传递 数学+递推

    1045: [HAOI2008] 糖果传递 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2975 Solved: 1327 [Submit][Sta ...

  8. [BZOJ1045][HAOI2008]糖果传递 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045 我们假设每一个小朋友的代价为$x[i]$,每一次都从前面一个小朋友那里拿,这种贪心跟 ...

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

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

随机推荐

  1. Python request 简单使用

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  2. Jmeter和Charles下载文件

    有时候我们jmeter做自动化测试是会遇到文件上传和文件下载的接口,这里我将接结合Charles来Jmeter 文件下载进行讲解 一.用Charles抓包分析文件下载接口 1.1.业务中文件下载链接如 ...

  3. Java并发基础--线程通信

    java中实现线程通信的四种方式 1.synchronized同步 多个线程之间可以借助synchronized关键字来进行间接通信,本质上是通过共享对象进行通信.如下: public class S ...

  4. 容器基础(八): 使用docker swarm部署程序

    环境 基于上一节的env/server:v0.1, env/worker:v0.1镜像, 在基于debian8.2的两台机器上测试部署docker swarm. docker service部署 ➜ ...

  5. Gitlab自动触发Jenkins构建项目

    Gitlab自动触发Jenkins构建项目 一.前提 Gitlab已安装配置好. Jenkins已安装Gitlab plugin. 二.配置jenkins中Job 1.勾选触发器下的gitlab触发器 ...

  6. 官方文档:11G新特性SQL PLAN BASLINE 执行计划基线

    什么是SQL执行计划管理? SQL计划管理(SQL plan management)是一咱预防机制,记录和评估SQL语句的执行计划.SQL plan management的主要功能是sql plan ...

  7. 软件工程项目组Z.XML会议记录 2013/09/14

    软件工程项目组Z.XML会议记录 [例会时间]2013年9月14日星期六21:00-22:30 [例会形式]小组讨论 [例会地点]新主楼A1025 [例会主持]李孟 [会议记录]李孟 会议整体流程 一 ...

  8. Coursera: Internet History, Technology, and Security

    课程网址:https://www.coursera.org/learn/internet-history 学习笔记: Week 1: History - Dawn of Early Computing ...

  9. Chromium之各国语言切换

    在\src\build\Debug\locales\目录下存放着各国语言所需要的资源文件xx.pak,我这边共有53中语言支持. 命令行进入src\build\Debug目录,敲:chrome.exe ...

  10. ArcGis下的叠加分析

     1矢量与矢量叠加的话就用ToolBox里有Overlay: 2如果是矢量和栅格叠加的话用Spatial analysis模块中的 zonal statistics: 3还有就是栅格与栅格的叠加S ...