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
水题算是状压的思想,写过类似的,一样的套路;
这个计算机的工作原理是:接到一批任务后,把每个任务随机地分配给一个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; }
相关文章推荐
- 分配任务,汇报进度,以及日常会议事项
- Daily Scrum 1 --团队项目所需时间估计以及任务分配
- 大数据处理中的任务分配问题
- [置顶] 0-1背包问题,两个CPU核分配任务问题
- activiti 用户任务分配指定
- (转) 项目经理如何分配任务
- 分配任务第一天
- 分配任务的沟通技巧
- 题目:任务分配
- 任务分配问题(匈牙利算法)
- 单片机用定时器分配任务的程序结构总结
- 项目管理之任务分配
- CCBPM 任务分配流程设计说明
- 我该怎么安排下属的工作-项目经理如何分配任务
- tyvj P1431 [Tyvj Jan]分配任务(最大流)
- mmc生产任务分配问题续
- python日常笔记3--关于分布式任务的分配
- 【转】工作感言:任务分配及管理
- 会议上,如何分配任务