0
点赞
收藏
分享

微信扫一扫

机试总结【c++】

you的日常 2022-03-11 阅读 54
c++算法

目录

第三十七题:流水线


第三十七题:流水线

一个工厂有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;
}
举报

相关推荐

0 条评论