多机调度问题
某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的较短时间。
- 输入
- 第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。
- 输出
- 所需的较短时间。(提示:不一定是最优解)
- 样例输入
-
2 2 2 1 5 6 3 2 5 13 15 16 20
- 样例输出
-
5 28
思路:对作业进行排序,如果n<=m,就是最大的作业时间;如果n>m,从最大的作业依次进行工作,每个作业接在完成的机器上,相当于银行取号系统,保证机器不空闲,直至作业做完。
#include<iostream> #include<cstring> #include<cstdlib> using namespace std; int a[10005]; int b[105]; int cmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int t; cin>>t; while(t--) { int n, m; cin>>n>>m; for(int i=0;i<n;i++) { cin>>a[i]; } qsort(a, n, sizeof(a[0]), cmp); memset(b, 0, sizeof(b)); if(n <= m) { cout<<a[n-1]<<endl; continue; } else { int max=0,min=0; int maxI, minI; for(int i=n-1;i>n-1-m;i--) { b[n-1-i]=a[i]; } min=b[m-1]; minI=m-1; max=b[0]; maxI=0; for(int i=n-1-m;i>=0;i--) { min += a[i]; b[minI] += a[i]; for(int j=0;j<m;j++) { if(b[j] >= max) { max=b[j]; maxI = j; } if(b[j] <= min) { min=b[j]; minI=j; } } } cout<<max<<endl; } } return 0; }
posted on 2012-06-04 21:10 java课程设计例子 阅读(516) 评论(0) 编辑 收藏 举报