算法学习:任务调度(),《算法笔记》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<x1是一样的,所以只需要重载小于号。

#include<iostream>
#include<cstdio>
#include<queue>
#include<string>
#include<map>
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<<t1.name<<" "<<t1.prior<<endl;
		}
		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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值