題目描述
某多處理器多道批處理系統一次允許將多有作業調入內存,且能並行執行,其並行數等於處理器個數。該系統采用SJF的調度方式(最短作業優先,系統在調度時,總是有限調度執行處理時間最短的作業)。
現給定處理器個數m,作業數n,每個作業的處理時間分別為t1, t2...tn.
當n>m時,首先處理時間短的m個作業進入處理器處理,其他進入等待,當某個作業處理完成時,依次從等待隊列中取處理時間最短的作業進入處理。
求系統處理完所有作業的耗時為多少?
注:不考慮作業切換的消耗。
輸入描述:
輸入2行,第一行為2個整數(采用空格分隔),分別表示處理器個數m和作業數n;第二行輸入n個整數(采用空格分隔),表示每個作業的處理時長t1, t2...tn。0<m, n<100, 0<t1, t2...tn<100。
輸出描述:
輸出處理總時長
示例1
輸入
3 5
8 4 3 1 10
輸出
13
說明
首先,執行時長為1、3、4的作業4(cpu1)、作業3(cpu2)、作業2(cpu3)進入處理。
1個時間單元后,作業4執行結束,作業1進入處理(cpu1);
3個時間單元后,作業3執行結束,作業5進入處理(cpu1);
4個時間單元后,作業2執行結束;
9個時間單元后,作業1執行結束;
13個時間單元后,作業5執行結束。
1.思考
- 首先,對作業的執行時常按照從小到大的順序進行排序;
- 其次,記錄最后一個作業所在的服務器序號;
- 最后,對該序號下執行的所有作業時長求和,即為處理總時長。
2.實現
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
int m, n;
while ( cin >> m >> n ){
int input;
vector<int> time;
for (int i = 0; i < n; i++){
cin >> input;
time.push_back(input);
}
sort(time.begin(), time.end());
int len = time.size();
int index = len % m - 1;
int res = 0;
for (int i = index; i < len; i = i + 3){
res += time[i];
}
cout << res << endl;
}
return 0;
}