问题 A: 任务调度
时间限制: 1 Sec 内存限制: 32 MB
提交: 102 解决: 72
[提交][状态][讨论版][命题人:外部导入]
题目描述
读入任务调度序列,输出n个任务适合的一种调度方式。
输入
输入包含多组测试数据。
每组第一行输入一个整数n(n<100000),表示有n个任务。
接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。
输出
输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。
样例输入
4
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)
样例输出
Task0 Task1 Task2 Task3
设置优先级,第一行输出的第一个把优先级设置为0,之后的优先级数值一次是前1个优先级数值加1.优先级依次降低。
按照优先级高的排序依次输出。
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
using namespace std;
int n;
struct task
{
string name;
int priority;
friend bool operator<(const task &t1, const task &t2)
{
if(t1.priority!=t2.priority)
return t1.priority > t2.priority;//输出优先级大的
else
return t1.name > t2.name;//输出字典序小的
}
};
void deal(string s, priority_queue<task> &p, map<string, int> &list)
{
string now = "";
task t;
int i=0;
//处理第一个
while(s[i]!='(')
{
now+=s[i];
i++;
}
if(list[now]==0)//第一个
{
t.name = now;
t.priority = 0;
list[now] = 0;
p.push(t);
}
s.erase(s.begin(), s.begin()+i);//删除Task0
s.erase(s.begin());//删除(
int temp = list[now]+1;
i=0;
now = "";
//处理括号里面的
while(i<s.size())
{
if((s[i]==','||s[i]==')')&&list[now]==0&&now!="NULL")
{
t.name = now;
t.priority = temp;
list[now] = temp;
p.push(t);
//cout<<now<<" "<<temp <<endl;
now = "";
}
else
now+=s[i];
i++;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
priority_queue<task> p;
map<string, int> list;//名字---优先级
for(int i=0; i<n; i++)
{
string s;
cin>>s;
deal(s, p, list);
}
while(p.empty()!=1)
{
cout<<p.top().name;
if(p.size()>1)
cout<<" ";
else
cout<<endl;
p.pop();
}
}
return 0;
}