多机调度问题--贪心策略

题目:设有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;
}

结果:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值