目录
第三十七题:流水线
一个工厂有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;
}









