目录
第三十七题:流水线
一个工厂有m条流水线
来并行完成n个独立的作业
该工厂设置了一个调度系统
在安排作业时,总是优先执行处理时间最短的作业
现给定流水线个数m
需要完成的作业数n
每个作业的处理时间分别为 t1,t2...tn
请你编程计算处理完所有作业的耗时为多少
当n>m时 首先处理时间短的m个作业进入流水线
其他的等待
当某个作业完成时,
依次从剩余作业中取处理时间最短的
进入处理
输入描述:
第一行为两个整数(采取空格分隔)
分别表示流水线个数m和作业数n
第二行输入n个整数(采取空格分隔)
表示每个作业的处理时长 t1,t2...tn
0<m,n<100
0<t1,t2...tn<100
输出描述
输出处理完所有作业的总时长
案例
输入
3 5
8 4 3 2 10
输出
13
说明
先安排时间为2,3,4的三个作业
第一条流水线先完成作业
调度剩余时间最短的作业8
第二条流水线完成作业
调度剩余时间最短的作业10
总共耗时 就是二条流水线完成作业时间13(3+10)
3 9
1 1 1 2 3 4 6 7 8
#include<iostream>
#include<cstdlib>
using namespace std;
int cmp(const void* a,const void* b){
return *(int*)a-*(int*)b;
}
int cmp1(const void* a,const void* b){
return *(int*)b-*(int*)a;
}
void m_time(int* list,int m,int n){
int* task=new int[m];
int* taskcount=new int[m];
for(int i=0;i<m;i++){
task[i]=list[i];
taskcount[i]=list[i];
}
int pos=m,flag=-1;
while(flag==-1){
for(int i=0;i<m;i++){
task[i]--;
if(task[i]==0){
task[i]=list[pos];
taskcount[i]+=list[pos];
pos++;
}
if(pos==n){
flag=1;
break;
}
}
}
qsort(taskcount,m,sizeof(int),cmp1);
cout<<taskcount[0]<<endl;
delete[]task;
delete[]taskcount;
}
int main(){
int m,n;
cin>>m>>n;
int* t=new int[n];
for(int i=0;i<n;i++){
cin>>t[i];
}
qsort(t,n,sizeof(int),cmp);
m_time(t,m,n);
delete[]t;
return 0;
}