您的位置:首页 > 其它

多机调度问题

2012-06-04 21:10 239 查看
描述

某工厂有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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: