您的位置:首页 > 其它

A - 任务的分配 HIT - 1939

2017-05-01 19:01 120 查看
哈尔滨工业大学计算机专业创建于1956年,是中国最早建立的两个计算机专业之一。哈工大计算机专业目前拥有雄厚的师资,其科研能力在全国处于领先地位。最近,工大经常接到一些大型的计算机科研项目。这些项目的运算量十分巨大,工大现有的计算机已经不能满足要求了。因此,工大最近购进了一台十分先进的巨型计算机。这个计算机有许多CPU,每个CPU都能单独地处理一个任务。

这个计算机的工作原理是:接到一批任务后,把每个任务随机地分配给一个CPU。但这样,就可能导致某些CPU上任务很多,而另一些CPU上任务很少甚至没有任务。这就降低了CPU的利用率,也降低了整机的效率。因此,这种情况下,计算机会自动地重新分配这些任务,使得每个CPU上有相同的任务量。

假设这台计算机有N个CPU,这些CPU编号为1~N。对于每个CPU,都有两个CPU与之相邻(编号为1和N的CPU只有1个和它们相邻)。分配任务时,每单位时间,每个CPU可以给和它相邻的CPU最多各传递一个任务。也就是说,每单位时间,每个CPU最多可以传递两个任务,分别给它的两个邻居。

现在,给你各CPU上的任务数,请你判断重新分配这些任务所需的时间。

Input

本题有多组数据,每组数据占两行。第一行是正整数N(2 <= N <= 10000),代表这台巨型计算机有N个CPU。第二行是N个整数,代表N个CPU上现有的任务数。这些整数不会超过10000。

Output

对于每组数据,如果可以做到让每个CPU上都有相同的任务数,则输出达到这个状态所需的时间。如果不能做到,输出-1。

Sample Input

3

0 99 3

2

49 50

8

16 17 15 0 20 1 1 2

10

0 0 100 0 0 0 0 0 0 0

Sample Output

34

-1

23

70

水题算是状压的思想,写过类似的,一样的套路;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
using namespace std;
const int MAX = 999999;
const double Eps = 1e-12;
const double PI = acos(-1.0);
int gcd(int x, int y)
{
return x%y == 0 ? y : gcd(y, x%y);
}
long long  a[10005];
long long  temp[10005];
long long max(long long a, long long b)
{
return a > b ? a : b;
}
int main()
{

int n;
while (cin >> n)
{
memset(temp, 0, sizeof(temp));
long long sum=0;
for (int i = 0; i < n; i++)
{
cin >> a[i];
sum += a[i];
}
long long ave = sum / n;
for (int i = 0; i < n - 1; i++)
{
if (a[i] > ave)
{
temp[i] = max(temp[i], a[i] - ave);
a[i + 1] += (a[i] - ave);
}
else if(a[i]<ave)
{
temp[i + 1] = max(temp[i + 1], ave - a[i]);
a[i + 1] -= (ave - a[i]);
}
}
if (a[n - 1] != ave) puts("-1");
else
{
long long ans = 0;
for (int i = 0; i < n; i++)
{
ans = max(ans, temp[i]);
}
cout << ans << endl;
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: