博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1045题解
阅读量:5171 次
发布时间:2019-06-13

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

【解题思路】

  (数据范围劝退?正确范围应该是n≤1000000)

  设xi表示第i个小朋友给第i+1个小朋友的糖果数(特殊的,xn表示第n个小朋友给第1个小朋友的糖果数),Â表示平均糖果数,有如下方程组:

•ai-xi+xi-1=Â(i∈[2,n]∩N)

•a1-x1+xn

  于是可整理为:

•x2=a1+x1

•x3=a2+x2-Â=a1+a2+x1-2Â

...

•xn=an-1+xn-1-Â=...=a1+a2+...+an-1+x1-(n-1)Â

  设sn=nÂ-∑ai(i∈[1,n]∩N),可整理为:

•x2=x1-s1

•x3=x1-s2

...

•xn=x1-sn-1

  而答案表达式为∑|xi|(i∈[1,n]∩N),展开即|x1|+∑|x1-si-1|(i∈[2,n]∩N),显然达到最小值时x1值为所有si及0的中位数。复杂度O(nlog2n)。

【参考代码】

1 #pragma GCC optimize(2) 2 #include 
3 #include
4 #define REP(i,low,high) for(register int i=(low);i<=(high);i++) 5 using namespace std; 6 static int n; long long a[1000010],s[1000010]; 7 int main() 8 { 9 scanf("%d",&n);10 long long ave=0ll; REP(i,1,n) scanf("%lld",a+i),ave+=a[i];11 ave/=n,s[n]=0ll; REP(i,1,n-1) s[i]=s[i-1]+a[i]-ave; sort(s+1,s+n+1);12 long long m=n&1?s[n+1>>1]:s[n>>1]+s[n+2>>1]>>1,ans=0ll;13 REP(i,1,n) ans+=llabs(m-s[i]); return printf("%lld\n",ans),0;14 }
View Code

 

转载于:https://www.cnblogs.com/spactim/p/6511961.html

你可能感兴趣的文章
Android自定义控件:动画类(九)----PropertyValuesHolder与Keyframe
查看>>
一次python 内存泄漏解决过程
查看>>
Python闭包与函数对象
查看>>
webview中文乱码
查看>>
2018GDKOI——记录
查看>>
[React] Use react-rewards to add microinteractions to React app to reward users for some actions
查看>>
[React] Style the body element with styled-components and "injectGlobal"
查看>>
[Angular2 Router] CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route
查看>>
[Grunt] Cleaning your build folder with grunt-contrib-clean
查看>>
discuz!之XML解析错误:废弃 document 元素之后的内容错误
查看>>
jvm类加载机制
查看>>
洛谷P1976 鸡蛋饼
查看>>
HDU 5236 Article 期望
查看>>
hadoop操作
查看>>
架构1
查看>>
第2章 数字之魅——数组循环移位
查看>>
关于CoreData的用法
查看>>
python 结巴分词
查看>>
Eclipse插件手动安装
查看>>
iOS开发肯定会遇到的
查看>>