【解题思路】

  (数据范围劝退?正确范围应该是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 <algorithm>
 3 #include <cstdio>
 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