您的位置:首页 > 编程语言 > C语言/C++

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

2020-04-05 12:13 465 查看

题目描述
读入任务调度序列,输出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;
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
imagination666 发布了3 篇原创文章 · 获赞 0 · 访问量 54 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: