题目:设有n个独立的作业,由m台相同的计算机进行加工。作业 i 的处理时间为 ti ,每个作业可在任何一台计算机上加工处理,但不能间断、拆分。要求给出一种作业调度方案,在尽可能短的时间内,由m台计算机加工处理完成这n个作业。
求:m台计算机处理完n个作业,所需的最短时间
求解多机调度问题的贪心策略是最长处理时间的作业优先,即把处理时间最长的作业分配给最先空闲的计算机。
input
第一行T(1<T<100)表示有T组测试数据。每组测试数据的第一行分别是整数n,m
(1<=n<=10000,1<=m<=100),接下来的一行是n个整数ti(1<=t<=100)。
output
所需最短时间
解题思路:
拿上面的例子来讲:
n =6 m =3
ti :2 5 13 15 16 20
从大到小排序后数组:20 16 15 13 5 2
初始数组为空
0 0 0(因为m = 3 ,所以3个是有效的,其余为0不考虑)
20 16 15(依次存入)
20 16 15+13(下面代码中的minimum函数功能)15最小
20 16+5 28 (16最小,新数组中)
20+2 21 28 (20最小,新数组中)
–
28 (所有作业完成的最短时间)
#include <iostream>
#include <algorithm>
using namespace std;
//n个独立工作的作业 m台计算机
/*
作业i的处理时间为ti
求最短完成时间
--长作业优先算法
*/
/*
input
6 3
2 5 13 15 16 20
output
28
*/
int minimun(int computer[],int m)
{
//找到最小的元素,并返回下标
int index = 0;
int min=computer[0];
for(int i=0;i<m;i++){
if(min > computer[i]){
min = computer[i];
index = i;
}
}
return index;
}
int maximum(int computer[],int m)
{
//找到最大值,并返回
int max = computer[0];
for(int i=0;i<m;i++){
if(max<computer[i]){
max = computer[i];
}
}
return max;
}
int main(void)
{
freopen("in.txt","r",stdin);
int n,m;
int sum_time = 0;
cin >> n >> m;
int t[n];
int computer[m];
for(int i=0;i<n;i++){
cin >> t[i];
}
sort(t,t+n,greater<int>());
//依次装载
for(int i=0;i<m;i++){
computer[i] = t[i];
}
int q=m; //设置游标q
for(;q<n;q++){
int min_index = minimun(computer,m);
computer[min_index] += t[q];
}
int max = maximum(computer,m);
cout << max << endl;
return 0;
}
结果: