初步解题原理:代数运算+单元素极值
代数运算:
xi表示第i个给i-1的数量,正负表示给或得
c=(a1+a2+a3....an)/n
a1-x1+x2=c -->x2=x1-a1+c
a2-x2+x3=c -->x3=x1-a1-a2+2c
a3-x3+x4=c -->x4=x1-a1-a2-a3+3c
......
an-xn+x1=c -->xn=x1-a1-a2-a3....-a(n-1)+(n-1)c
ans=max{|x1|+|x2|+|x3|+....|xn|=|x1-0|+|x1-a1+c|+|x1-a1-a2+2c|.......|x1-a1-a2-a3....-a(n-1)+(n-1)c|}
我们可以用x1表示任意量
ans=min{|x-b1|+|x-b2|+|x-b3|+|x-b4|.......+|x-bn|}
当x取{b1,b2,b3,.....bn}排序后的中位数时,ans取最小值
1 #include<iostream> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 #include<stdio.h> 6 #define ULL unsigned long long 7 #define LL long long 8 #define maxn 1000009 9 using namespace std; 10 LL a[maxn]; 11 LL b[maxn]; 12 int main() 13 { 14 int n; 15 while(~scanf("%d",&n)) 16 { 17 ULL C=0; 18 for(int i=1;i<=n;i++) 19 { 20 scanf("%lld",&a[i]); 21 C+=a[i]; 22 } 23 C=C/n; 24 b[0]=0; 25 for(int i=1;i<n;i++) 26 { 27 b[i]=b[i-1]-C+a[i]; 28 } 29 sort(b,b+n); 30 ULL ans=0; 31 LL mid=b[n/2]; 32 for(int i=0;i<n;i++) 33 { 34 ans+=abs(mid-b[i]); 35 } 36 printf("%lld\n",ans); 37 } 38 return 0; 39 }