【算法笔记第6.6节 priority_queue 】问题 A: 任务调度(有点难)

问题 A: 任务调度

时间限制: 1 Sec  内存限制: 32 MB
提交: 102  解决: 72
[提交][状态][讨论版][命题人:外部导入]

题目描述

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

输入

输入包含多组测试数据。

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

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

输出

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

样例输入

4
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)

样例输出

Task0 Task1 Task2 Task3

设置优先级,第一行输出的第一个把优先级设置为0,之后的优先级数值一次是前1个优先级数值加1.优先级依次降低。

按照优先级高的排序依次输出。

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
using namespace std;
int n;
struct task
{
    string name;
    int priority;
    friend bool operator<(const task &t1, const task &t2)
    {
        if(t1.priority!=t2.priority)
            return t1.priority > t2.priority;//输出优先级大的
        else
            return t1.name > t2.name;//输出字典序小的
    }
};
void deal(string s, priority_queue<task> &p, map<string, int> &list)
{
    string now = "";
    task t;
    int i=0;
    //处理第一个
    while(s[i]!='(')
    {
        now+=s[i];
        i++;
    }
    if(list[now]==0)//第一个
    {
        t.name = now;
        t.priority = 0;
        list[now] = 0;
        p.push(t);
    }
    s.erase(s.begin(), s.begin()+i);//删除Task0
    s.erase(s.begin());//删除(
    int temp = list[now]+1;
    i=0;
    now = "";


    //处理括号里面的
    while(i<s.size())
    {
        if((s[i]==','||s[i]==')')&&list[now]==0&&now!="NULL")
        {
            t.name = now;
            t.priority = temp;
            list[now] = temp;
            p.push(t);
            //cout<<now<<" "<<temp <<endl;
            now = "";
        }
        else
            now+=s[i];
        i++;
    }
}
int main()
{

    while(scanf("%d",&n)!=EOF)
    {
        priority_queue<task> p;
        map<string, int> list;//名字---优先级
        for(int i=0; i<n; i++)
        {
            string s;
            cin>>s;
            deal(s, p, list);
        }
        while(p.empty()!=1)
        {
            cout<<p.top().name;
            if(p.size()>1)
                cout<<" ";
            else
                cout<<endl;
            p.pop();
        }
    }
    return 0;
}

 

 

 

 

上一篇:优先队列(初了解)


下一篇:flex布局父项常见属性