UVA11300

初步解题原理:代数运算+单元素极值

代数运算:

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
",ans);
37     }
38     return 0;
39 }
原文地址:https://www.cnblogs.com/little-w/p/3341947.html