/*
一个工厂有m条流水线
来并行完成n个独立的作业
该工厂设置了一个调度系统
在安排作业时,总是优先执行处理时间最短的作业
现给定流水线个数m
需要完成的作业数n
每个作业的处理时间分别为 t1,t2…tn
请你编程计算处理完所有作业的耗时为多少
当n>m时 首先处理时间短的m个作业进入流水线
其他的等待
当某个作业完成时,
依次从剩余作业中取处理时间最短的
进入处理
输入描述:
第一行为两个整数(采取空格分隔)
分别表示流水线个数m和作业数n
第二行输入n个整数(采取空格分隔)
表示每个作业的处理时长 t1,t2...tn
输出描述
输出处理完所有作业的总时长
*/
#include
#include
#include
#include
#include
using namespace std;
int main() {
string sin;
getline(cin, sin);
vectorarr;
int temp;
istringstream stemp(sin);
while (stemp >> temp) {
arr.push_back(temp);
}
//arr[0]表示有几条流水线\arr[1]表示有几个独立的作业
vectorarr2;
//输入n个整数–每个作业的处理时常
cin.sync();
cin.clear();
getline(cin, sin);
istringstream s2(sin);
while (s2 >> temp) {
arr2.push_back(temp);
}
//要优先执行时间最短的作业–所以先排序
sort(arr2.begin(), arr2.end());
//如果处理的任务时小于流水线的个数—说明可以一次性处理完–时间为任务最大的时间
if (arr[1] <= arr[0]) {
cout << arr2[arr2.size() - 1];
return 0;
}
//先让流水线上充满任务
vectorarr3(arr[0]);
for (int i = 0; i < arr[0]; i++) {
arr3[i] = arr2[i];
}
auto it = arr3.begin();
for (int i = arr[0]; i < arr2.size(); i++) {
//从第一个任务开始–一次给每个流水线加上对应的任务
if (it == arr3.end()) {
it = arr3.begin();
}
*it += arr2[i];
it++;
}
int maxtime = INT32_MIN;
//求出流水线上–最耗时的那个任务输出
for (int i = 0; i < arr3.size(); i++) {
maxtime = max(arr3[i], maxtime);
}
cout << maxtime;
return 0;
}