(贪心)多机调度问题

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

这并不是一道oj上的题目,反正我是没找到。。。

应该属于一类题目。

解题思路就是贪心的思想。

我们现将所有的时间排序。

第一种情况:n<=m    时间最长的工作就是我们需要求解的总时间。

第二种情况:n>m    

这时候我们就将m个机器分配给前m个时间最长的工作,直到有机器空闲下来,我们将闲下的机器继续向后分配。直到分配到没有工作可做了。当前的时间再加上还没有做完的工作的最长时间就是我们所要求的总时间。

代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 int a[1005],b[1005];   
 7 bool cmp(int a,int b){
 8     return a>b;
 9 }
10 int main(){
11     int n,m;
12     int T;
13     cin>>T;
14     while(T--){
15         int n,m;
16         cin>>n>>m;
17         for(int i=0;i<n;i++){
18             scanf("%d",a+i);
19         }
20         memset(b,0,sizeof(b));
21         sort(a,a+n,cmp);
22         if(n<=m){
23             cout<<a[0]<<endl;
24             continue;
25         }else{
26             int sum=0;
27             int now=m;
28             while(now<n){
29                 sum++;
30                 int cnt=0;     //cnt是这分钟结束后有几台机器空闲下来
31                 for(int i=0;i<now;i++){
32                     b[i]++;
33                     if(b[i]==a[i]){
34                         cnt++;
35                     }
36                 }
37                 now+=cnt;
38             }
39             int mx=0;
40             for(int i=0;i<n;i++){
41                 if(a[i]>b[i])
42                     mx=max(mx,a[i]-b[i]);    //找出还没做完的工作的最长时间
43             }
44             cout<<sum+mx<<endl;
45         }
46     }
47     return 0;
48 }

 

转载于:https://www.cnblogs.com/ISGuXing/p/7308900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值