1985 Problem A 任务调度
发布日期:2021-07-01 03:06:36 浏览次数:2 分类:技术文章

本文共 1573 字,大约阅读时间需要 5 分钟。

问题 A: 任务调度

时间限制: 1 Sec 内存限制: 32 MB
提交: 40 解决: 27

题目描述

读入任务调度序列,输出n个任务适合的一种调度方式。

输入

输入包含多组测试数据。

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

接下来n行,每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为NULL则表示无后继任务。

输出

输出调度方式,输出如果有多种适合的调度方式,请输出字典序最小的一种。

样例输入

4
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)
样例输出
Task0 Task1 Task2 Task3

经验总结

本题的注意点题目已经给的很清晰了,关键是要理清思路,善于使用STL,往往能事半功倍。

正确代码

#include 
#include
#include
#include
#include
using namespace std;struct Task{ string name; int level; friend bool operator <(const Task &t1,const Task &t2) { if(t1.level!=t2.level) return t1.level>t2.level; else return t1.name>t2.name; }};void dispose(string str,priority_queue
&task,unordered_map
&list){ string first; int pos; int firstlevel; pos=str.find('('); first=str.substr(0,pos); str.erase(0,pos+1); if(list.count(first)==0) { Task newtask; newtask.name=first; newtask.level=0; task.push(newtask); firstlevel=list[first]=0; } else { firstlevel=list[first]; } while(str.empty()==false) { string last; pos=str.find(','); if(pos==string::npos) { pos=str.find(')'); last=str.substr(0,pos); str.clear(); } else { last=str.substr(0,pos); str.erase(0,pos+1); } if(last!="NULL") { Task newtask; newtask.name=last; newtask.level=firstlevel+1; list[last]=newtask.level; task.push(newtask); } }}int main(){ int n; while(~scanf("%d",&n)) { priority_queue
task; unordered_map
list; string temp; for(int i=0;i
>temp; dispose(temp,task,list); } while(task.empty()==false) { cout<

转载地址:https://meteorrain.blog.csdn.net/article/details/81008048 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:1863 Problem A C语言-数字交换
下一篇:Codeup小白掉坑经验总结之 字符串处理 id=1983(此题未解决!因题意不明,不知如何解决。。)

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月15日 14时58分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章