华为od37

/*
一个工厂有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值