Description
In the school computer room there are n servers which are responsible for processing several computing tasks. You know the number of scheduled tasks for each server: there are mi tasks assigned to the i-th server.
In order to balance the load for each server, you want to reassign some tasks to make the difference between the most loaded server and the least loaded server as small as possible. In other words you want to minimize expression ma - mb, where a is the most loaded server and b is the least loaded one.
In one second you can reassign a single task. Thus in one second you can choose any pair of servers and move a single task from one server to another.
Write a program to find the minimum number of seconds needed to balance the load of servers.
Input
The first line contains positive number n (1 ≤ n ≤ 105) — the number of the servers.
The second line contains the sequence of non-negative integers m1, m2, ..., mn (0 ≤ mi ≤ 2·104), where mi is the number of tasks assigned to the i-th server.
Output
Print the minimum number of seconds required to balance the load.
Sample Input
2 1 6
2
7 10 11 10 11 10 11 11
0
5 1 2 3 4 5
3
Hint
In the first example two seconds are needed. In each second, a single task from server #2 should be moved to server #1. After two seconds there should be 3 tasks on server #1 and 4 tasks on server #2.
In the second example the load is already balanced.
A possible sequence of task movements for the third example is:
- move a task from server #4 to server #1 (the sequence m becomes: 2 2 3 3 5);
- then move task from server #5 to server #1 (the sequence m becomes: 3 2 3 3 4);
- then move task from server #5 to server #2 (the sequence m becomes: 3 3 3 3 3).
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn=100000+4;
int a[maxn];
int main()
{
int n;
cin>>n;
long long sum=0,sum1=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+n+1);
int p=sum/n;//平均的最小数;
int k=sum%n;//最大数的个数;
for(int i=1;i<=n-k;i++)//最小数得到时移动的次数;
{
sum1+=abs(a[i]-p);
}
for(int i=n-k+1;i<=n;i++)//最大数移动的次数;
{
sum1+=abs(a[i]-p-1);
}
cout <<sum1/2<< endl;
return 0;
}
本文介绍了一种算法,用于在多台服务器间平衡计算任务负载,通过重新分配任务来最小化最忙与最闲服务器间的差异,提供了实现代码示例。
166

被折叠的 条评论
为什么被折叠?



