问题 A: 任务调度
时间限制: 1 Sec 内存限制: 32 MB
提交: 57 解决: 40
[提交][状态][讨论版][命题人:外部导入]
题目描述
读入任务调度序列,输出n个任务适合的一种调度方式。
输入
输入包含多组测试数据。
每组第一行输入一个整数n(n<100000),表示有n个任务。
接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。
输出
输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。
样例输入
4 Task0(Task1,Task2) Task1(Task3) Task2(NULL) Task3(NULL)
样例输出
Task0 Task1 Task2 Task3
#include<iostream>
#include<queue>
#include<string>
#include<unordered_map>
using namespace std;
//将任务名name和优先级level存入结构体,并使用优先队列设定排序方式
//利用不排序map,将name映射level,存入统计的优先级
struct Task {
int level;
string name;
friend bool operator <(const Task &a, const Task &b) {
if (a.level != b.level)return a.level > b.level;
else return a.name > b.name;
}
};
void dispose(string str, priority_queue<Task> &task, unordered_map<string, int> &list) {
int index = str.find('(');
string first = str.substr(0, index);
str.erase(0, index + 1);
int firstlevel;
if (list.count(first) == 0) {
Task newtask;
newtask.name = first;
newtask.level = 0;
task.push(newtask);
firstlevel = list[first] = 0;
}
else firstlevel = list[first];
while (!str.empty()) {
string last;
index = str.find(',');
if (index == string::npos) {
index = str.find(')');
last = str.substr(0, index);
str.clear();
}
else {
last = str.substr(0, index);
str.erase(0, index + 1);
}
if (last != "NULL") {
Task newtask;
newtask.name = last;
newtask.level = firstlevel + 1;
list[last] = newtask.level;
task.push(newtask);
}
}
}
int main() {
int n;
while (cin >> n) {
priority_queue<Task> task;
unordered_map<string, int> list;
for (int i = 0; i < n; i++) {
string s;
cin >> s;
dispose(s, task, list);
}
while (!task.empty()) {
cout << task.top().name;
task.pop();
if (!task.empty()) cout << " ";
}
list.clear();
}
return 0;
}