【解题思路】
(数据范围劝退?正确范围应该是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 #include3 #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 }