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());
}
}