算法笔记课后习题 6.6 priority_queue的常见用法详解 问题 A: 任务调度

版权声明:原创文章,转载请注明出处 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;
}

猜你喜欢

转载自blog.csdn.net/hza419763578/article/details/88412100
6.6
今日推荐