C++解法
3.最短耗时:
系统需要执行任务列表,系统可以随意选取需要执行的任务,每个任务的执行时间均为1s,但执行相同的任务期间会有cd,执行完一个任务后不能紧接着继续执行相同任务,必须等待cd结束。
第一行输入需要执行的任务名称列表,第二行输入执行相同任务的cd,请你输出任务被执行完毕的最短耗时。
例:
输入:
1,3,3,5,3,2,5,2,5,5,5
1
输出:
11
输入:
2,2,2,3
2
输出:
7
#include <iostream>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int k, time = 0;
string input, tmp;
cin >> input;
cin >> k;
istringstream istst(input);
map<int, int> taskcount;
while (getline(istst, tmp, ','))
taskcount[stoi(tmp)]++;
vector<vector<int>> tasklist;
for (auto i : taskcount) {
tasklist.push_back(vector<int>());
tasklist[tasklist.size() - 1].push_back(i.first);
tasklist[tasklist.size() - 1].push_back(i.second);
tasklist[tasklist.size() - 1].push_back(0);
}
sort(tasklist.begin(), tasklist.end(), [](vector<int>& a, vector<int>& b) { return a[1] > b[1]; });
while (!tasklist.empty()) {
for (int i = 0; i < tasklist.size(); i++) {
int mincd = 100;
time += (tasklist[i][2] + 1);
tasklist[i][1]--;
for (auto& j : tasklist) {
if (j[2] > tasklist[i][2] + 1)
j[2] -= (tasklist[i][2] + 1);
else { j[2] = 0; }
}
tasklist[i][2] = k;
if (tasklist[i][1] == 0) { tasklist.erase(tasklist.begin() + i); }
sort(tasklist.begin(), tasklist.end(), [](vector<int>& a, vector<int>& b) { return a[1] > b[1]; });
for (int j = 0; j < tasklist.size(); j++) {
if (tasklist[j][2] < mincd) {
mincd = tasklist[j][2];
i = j - 1;
}
}
}
}
cout << time << endl;
}