609C Load Balancing
题意:
”平均数“的意思是:最大数和最小数之间的差值为0或1;
先求“平均”数组,再相减。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<algorithm> 5 #include<math.h> 6 #include<memory.h> 7 #define clc(a,b) memset(a,b,sizeof(a)) 8 #define ll long long int 9 using namespace std; 10 11 int n; 12 int a[100010]; 13 14 int main() 15 { 16 while(~scanf("%d",&n)) 17 { 18 clc(a,0); 19 ll sum=0; 20 ll ans=0; 21 for(int i=0; i<n; i++) 22 { 23 scanf("%d",&a[i]); 24 sum+=a[i]; 25 } 26 sort(a,a+n); 27 if(sum%n==0) 28 { 29 int ave=sum/n; 30 for(int i=0;i<n;i++) 31 ans+=fabs(ave-a[i]); 32 ans=ans/2; 33 } 34 else 35 { 36 ll res=sum%n; 37 ll ave=(sum-res)/n; 38 //int vv=ave; 39 int b[100010]; 40 //memset(b,ave,sizeof(b)); 41 for(int i=0;i<n;i++) 42 b[i]=ave; 43 // cout<<ave<<endl; 44 // cout<<b[1]<<endl; 45 for(int i=n-1;i>n-1-res;i--) 46 { 47 b[i]+=1; 48 } 49 // cout<<b[1]<<endl; 50 // for(int i=0;i<n;i++) 51 // { 52 // cout<<b[i]<<endl; 53 // } 54 for(int i=0;i<n;i++) 55 { 56 ans+=fabs(b[i]-a[i]); 57 } 58 ans/=2; 59 } 60 cout<<ans<<endl; 61 } 62 return 0; 63 }