Codeup:1985 任務調度

1985 任務調度

題目大意

讀入任務調度序列,輸出n個任務適合的一種調度方式。
每組第一行輸入一個整數n(n<100000),表示有n個任務。
接下來n行,每行第一個表示前序任務,括號中的任務爲若干個後序任務,表示只有在前序任務完成的情況下,後序任務才能開始。若後序爲NULL則表示無後繼任務。

輸入

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

輸出

Task0 Task1 Task2 Task3

注意

1、主要是優先隊列的用法,怎麼設置結構體的優先級。
2、還需要用到map進行string->int,初始化所有映射的int都是0.

代碼

#include<stdio.h>
#include<iostream>
#include<string>
#include<map>
#include<queue>

using namespace std;
struct task{
    string name;
    int priority;
    bool operator <(const task &t)const{
        if(priority==t.priority) return name>t.name;//字典序小的在頂堆
        else return priority>t.priority;//重載<,priority小的在頂堆
    }
};
map<string,int> mp;
priority_queue<task> q;

void deal(const string &str){
    task tmp;
    tmp.name=str.substr(0,5);
    if(str[6]!='N'){//如果有後續任務
        int idx=5;
        while(str[idx]!=')'){
            idx++;
            mp[str.substr(idx,5)]++;
            idx+=5;
        }
    }
    else{//如果沒有後續任務
    }
    tmp.priority=mp[tmp.name];
    q.push(tmp);
}
int main(void){
    int n;
    scanf("%d%*c",&n);
    for(int i=0;i<n;i++){
        string str;
        cin>>str;
        deal(str);
    }
    int len=q.size(); 
    for(int i=0;i<len;i++){
        string tmp;
        tmp=q.top().name;
        q.pop();
        if(i<len-1) printf("%s ",tmp.c_str());
        else printf("%s",tmp.c_str());
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章