题目:[HAOI2008]糖果传递

光看题几乎没有思路,但是显然到最后每个人手中一定有 d=s/n个糖果(s为所有人糖果总和),不妨设2号给1号x2个糖果,3号给2号x3个.....1号给n号x1个,那么显然a1-x1+x2=d,a2-x2+x3=d

这不就是个n元n次方程组,但是不是,最后一个方程组可以由前面的方程组推出来,因此我们试着用x1表示其他的x,x2=d+x1-a1=x1-c1 (c1=a1-d),x3=d+x2-a2=d+d+x1-a1-a2=x1+d-c1-a2=x1-c2(c2=c1+a2-d)....

我们希望abs(x1)+abs(x2)....+abs(xn)最小,也就是abs(x1)+abs(x1-c1)+abs(x1-c2)....最小,怎么办呢,不难联想绝对值几何意义,先把零点(c)排序,然后中间(奇)的或中间部分(偶)一定是使得上述式子最小的点。

代码:

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#define int long long
const int N=1e6+5;
using namespace std;
int n,a[N],c[N],m,s;
signed main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]),m+=a[i];
m/=n;
for(int i=1;i<n;i++)
c[i]=c[i-1]+a[i]-m;
sort(c,c+n);
int pos=c[n/2],ret=0;
for(int i=0;i<n;i++)
ret+=abs(c[i]-pos);
printf("%lld\n",ret);
return 0;
}

最新文章

  1. 负margin的移位参考线
  2. 三种经典iPhone上网络抓包方法详解
  3. Git删除tag
  4. 2015年12月13日 spring初级知识讲解(四)面向切面的Spring
  5. ccc tiledmap 获取元素属性
  6. IMongoQuery的内部实现Query的用法
  7. Java编程思想学习(三) 初始化与清理
  8. svn命令在linux下的使用
  9. C#和SQl 注入字符串的攻击 和 防止注入字符转的攻击
  10. Exchange 2010 邮箱大小限制原则
  11. yii 中引入js 和css 的方式
  12. 九度OJ 1348 数组中的逆序对 -- 归并排序
  13. BZOJ3190[JLOI2013]赛车
  14. iOS开发:详解Objective-C runTime
  15. SQL注入(一) - 入门篇
  16. 洛谷 [P2763]试题库问题
  17. AngularJS进阶(二十六)实现分页操作
  18. 高淇java300集JAVA面向对象的进阶作业
  19. python入门 -- 环境搭建(windows)
  20. Mobius反演的套路

热门文章

  1. 【lwip】06-网络接口层分析
  2. grub2配置文件丢失如何修复
  3. GB/T 28181联网系统通信协议结构和技术实现
  4. ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境
  5. KingbaseES sys_blocking_pids 函数
  6. KingbaseES V8R6集群部署案例之---Windows环境配置主备流复制(同一主机)
  7. KingbaseES V8R6 账号异常登录锁定案例
  8. 一个包搞定中文数据集: datasetstore
  9. Ansible_基础模块
  10. 【设计模式】Java设计模式 - 组合模式