版权声明:原创文章,转载请注明出处 https://blog.csdn.net/hza419763578/article/details/88412100
问题 A: 任务调度
时间限制: 1 Sec 内存限制: 32 MB
提交: 104 解决: 74
[提交][状态][讨论版][命题人:外部导入]
题目描述
读入任务调度序列,输出n个任务适合的一种调度方式。
输入
输入包含多组测试数据。
每组第一行输入一个整数n(n<100000),表示有n个任务。
接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。
输出
输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。
样例输入
4 Task0(Task1,Task2) Task1(Task3) Task2(NULL) Task3(NULL)
样例输出
Task0 Task1 Task2 Task3
随便写写,先存在map里name->n (name任务名 n级别) 然后存到结构体 然后存到priority_queue即可
#include<iostream>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
const int N=1e5+10;
map<string,int> mp;
struct Task
{
string name;
int n;
friend bool operator< (Task t1,Task t2){
if(t1.n!=t2.n) return t1.n<t2.n;
else return t1.name>t2.name;
}
}task[N];
priority_queue<Task> q;
int main(){
int n;
string s,st1,st2;
while(cin>>n){
mp.clear();
for(int i=0;i<n;i++){
cin>>s;
int x1=s.find_first_of("(");
st1=s.substr(0,x1);
// cout<<st<<endl;
if(mp.find(st1)==mp.end()){
mp[st1]=0;
}
int x2;
x1++;
while((x2=s.find(",",x1))!=string::npos||(x2=s.find(")",x1))!=string::npos){
st2=s.substr(x1,x2-x1);
if(st2=="NULL"){
x1=x2+1;
continue;
}
if(mp.find(st2)==mp.end()){
mp[st2]=mp[st1]-1;
}else{
mp[st2]=min(mp[st1]-1,mp[st2]);
}
if(x2==s.length()-1) break;
x1=x2+1;
}
}
// cout<<"\n输出:\n";
int index=0;
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++){
// cout<<it->first<<" "<<it->second<<endl;
task[index].name=it->first;
task[index].n=it->second;
q.push(task[index++]);
}
while(!q.empty()){
cout<<q.top().name<<" ";
q.pop();
}
cout<<endl;
}
return 0;
}