博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1045][HAOI2008]糖果传递 数学
阅读量:5144 次
发布时间:2019-06-13

本文共 1211 字,大约阅读时间需要 4 分钟。

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1045

我们假设每一个小朋友的代价为$x[i]$,每一次都从前面一个小朋友那里拿,这种贪心跟纸牌均摊很像,想一想很容易理解。

设最后每个小朋友能得到$ave$个糖果,所以有$a[i]+x[i]-x[i+1]=ave$。

写出每一个形如这样的式子,可以消元得到$x[n]=x[1]+(n-1)*ave-sum[n-1]$。

我们令$c[i]=(i-1)*ave-sum[i-1]$,则我们最后所求为$Ans=\{\sum_{i=1}^n|x[1]-c[i]|\}_{min}$。

把$x[1]$和$c[i]$看成数轴上的点,可以证明当$x[1]$为$c[i]$的中位数时,取得$Ans$值。

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 typedef long long ll; 7 int inline readint(){ 8 int Num;char ch; 9 while((ch=getchar())<'0'||ch>'9') ;Num=ch-'0';10 while((ch=getchar())>='0'&&ch<='9') Num=Num*10+ch-'0';11 return Num;12 }13 int N;14 ll a[1000010],b[1000010],ave;15 int main(){16 N=readint();17 ll sum=0;18 for(int i=1;i<=N;i++){19 a[i]=readint();20 sum+=a[i];21 }22 ave=sum/N;23 sum=0;24 for(int i=1;i<=N;i++){25 b[i]=ave*(i-1)-sum;26 sum+=a[i];27 }28 sort(b+1,b+1+N);29 int mid=N+1>>1;30 ll ans=0;31 for(int i=1;i<=N;i++) ans+=abs(b[mid]-b[i]);32 printf("%lld\n",ans);33 return 0;34 }

 

转载于:https://www.cnblogs.com/halfrot/p/7630107.html

你可能感兴趣的文章
跨域请求
查看>>
NOI2018垫底记
查看>>
快速切题 poj 1002 487-3279 按规则处理 模拟 难度:0
查看>>
判断线段是否相交
查看>>
Codeforces Round #277 (Div. 2)
查看>>
一步步学Mybatis-搭建最简单的开发环境-开篇(1)
查看>>
微信小程序图片上传
查看>>
【更新】智能手机批量添加联系人
查看>>
NYOJ-128前缀式计算
查看>>
centos6.7 配置外网端口映射
查看>>
红外通信基础(含代码)
查看>>
淡定,啊。数据唯一性
查看>>
java并发编程之lock锁
查看>>
深入理解 JavaScript 事件循环(一)— event loop
查看>>
Hive(7)-基本查询语句
查看>>
常用第三方(分享,支付,二维码,语音,推送)
查看>>
Redis快速入门
查看>>
动态绑定时的显示隐藏控制
查看>>
注意java的对象引用
查看>>
C++ 面向对象 类成员函数this指针
查看>>