《算法笔记》6.6小节 问题 A: 任务调度

这道题我一开始看到的时候,想到的是拓补排序,可是这么菜又这么懒的我怎么可能用呢,既然出现在优先队列里面,那么久一定和他有关了

可是并没有使用优先队列


思路:

对于这道题,我们肯定是对他们定义优先级,然后进行排序了,最后输出。思路还是挺好想der。

实现:

首先肯定是一行行的先处理数据啦。咋处理?你不会问神奇海螺吗根据(),这几个符号了做。先定义一个word,来存储字符串。当遇到(,那说明需要先完成的任务输入完了,将word赋值到beg里面去,清空word,然后处理 ), ,当遇到这两个符号的时候,代表输入的后面的字符结束了,可以进行优先级计算了。设置一个map<string,int> bzzs,将bzzs[word] = bzzs[beg] + 1,存储优先级。最后进行排序。注意注意!!!!重点来了:如何对map进行排序呢?

先将map的值全部存储到一个结构体里面,对结构体排序就行,最后输出就行了。因为map本身按照string排好了,不能按值排序了,所以我们需要转化。

no body knows codeing better than me

#include <bits/stdc++.h>
using namespace std;
struct node{
	string name;
	int lev;
};
int n , len;
string s;
node zc[10010];	//用来对map进行转化 
map<string , int> bzzs; //变阻真帅(雾) 
bool cp(node x , node y){
	if(x.lev == y.lev) 	return x.name < y.name;
	return x.lev < y.lev;
}
int main(){
	cin >> n;
	while(n--){
		getline(cin , s);
		string word , beg;
		for(int j = 0; j < s.length(); j++){
			if(word == "NULL"){ //直接不管它 
				word == "";
				continue;
			}
			if(s[j] == '('){	 
				beg = word;
				word = "";
				j++;
			}
			if(s[j] == ',' || s[j] == ')'){
				bzzs[word] = bzzs[beg] + 1;
				word = "";
				j++;
			}
			word += s[j];
		}
	}
	for(map<string , int>::iterator i = bzzs.begin(); i != bzzs.end(); i++){
		len++;
		zc[len].name = i -> first;
		zc[len].lev = i -> second;
	}
	sort(zc + 1 , zc + len + 1 , cp);
	for(int i = 1; i <= len; i++) cout << zc[i].name << " ";
	return 0;
}
/*
4
Task0(Task1,Task2)
Task1(Task3)
Task2(NULL)
Task3(NULL)
*/


悄悄话:其实我的代码不输入最后一个数据的(大雾),但还是A了,可能因为前面的数据已经可以决定优先级了吧XD

原文地址:https://www.cnblogs.com/bzzs/p/13048047.html