算法学习:任务调度(),《算法笔记》6.6小节——C++标准模板库(STL)介绍->priority_queue的常见用法详解

题目描述
读入任务调度序列,输出n个任务适合的一种调度方式。
输入
输入包含多组测试数据。

每组第一行输入一个整数n(n<100000),表示有n个任务。

接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。
输出
输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。
样例输入
4
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)
样例输出
Task0 Task1 Task2 Task3
思路
设置优先级,在这里我用较小数字表示较高优先级,每行输入的括号内的任务名仅仅做优先级的更新,用map来映射string对应的优先级int,当括号内的任务对应整数小于括号外的对应整数时,更新,将括号内的任务对应整数加一。
全部数据输入完成后,将map中的任务名string和优先数int以结构体的形式加入优先队列。
优先队列默认是从大到小排序,包括字典序和整数排序,所以要对结构体的比较运算‘<’进行重构。
需要注意的一点,重载大于号会出错,因为数学上x1>x2,和x2

#include
#include
#include
#include
#include
using namespace std;
struct task{
	string name;
	int prior;
	friend bool operator <(task t1,task t2){
		if(t1.prior!=t2.prior)
			return t1.prior>t2.prior;
		else
			return t1.name>t2.name;
	}
};
int main()
{
	int n;
	priority_queue<task> q;
	cin>>n;
	int p=0;
	map<string,int> mp;
	for(int i=0;i<n;i++)
	{
		string s,t="";
		cin>>s;
		string tname;
		for(int j=0;j<s.size();j++)
		{
			
			if(s[j]=='(')
			{	
				if(t=="NULL")
					continue;
				if(mp.find(t)==mp.end())
				{
					mp[t]=0;
				}
				tname=t;
				t="";
			}
			else if(s[j]==','||s[j]==')')
			{
				if(t=="NULL")
					continue;
				mp[t]=mp[tname]+1;
				t="";	
			}	
			else{
				t+=s[j];
			}	
		}
		
	}
	for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
		{
			task t1;
			t1.name=it->first;
			t1.prior=it->second;
			q.push(t1);
			//cout<
		}
		int k=q.size();	
	for(int i=0;i<k-1;i++)
	{
		task t1=q.top();
		cout<<t1.name<<" ";
		q.pop();
	}
	cout<<q.top().name<<endl;
	return 0;
}

你可能感兴趣的:(算法学习)