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 }
View Code

 

posted @ 2015-12-28 20:22  yyblues  阅读(207)  评论(0编辑  收藏  举报