多机调度问题

本文介绍了一种解决多机调度问题的算法,通过最长处理时间作业优先的贪心策略,实现n个作业在m台机器上的最优调度,以达到最短总处理时间。

某工厂有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

解题思路:(贪心算法)

采用最长处理时间作业优先的贪心算则策略设计出解多机调度问题的较好的近似算法。

1.当n<=m时,只要将作业时间区间分配给作业即可。时间为最长时间的作业。

2.当n>m时,首先将n个作业从大到小排序。然后依此顺序分步将作业分配给空闲的处理机,每步分配给一个机器,而且需要考虑分配哪一个作业。根据这种思想可利用如下贪心原则:从剩下的作业中,选择需要处理时间最长。然后依次选择处理时间次长的作业,直到所有的作业全部处理完毕,或者机器不能再处理其他作业。


代码如下:

#include<iostream> #include<algorithm> #include<string.h> using namespace std; int speed[10010]; int mintime[101]; bool cmp( const int &x, const int &y ) { return x > y; } int main() { int t; cin>>t; while(t--) { int m, n; memset(speed, 0, sizeof(speed)); memset(mintime, 0, sizeof(mintime)); cin>>n>>m; for(int i = 0; i < n; ++i) { cin>>speed[i]; } sort(speed, speed + n, cmp); for(int i = 0; i < n; ++i) //同时满足n <= m和n > m { *min_element(mintime, mintime + m) += speed[i]; //当mac >= task时,复制 mac < task时,最小元素累加(贪心倒罗) } cout<<*max_element(mintime, mintime + m)<<endl; //最大的即为总时间 } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值