Diario de aprendizaje de "Nota de algoritmo" 6.6 uso común de prioridad_queue en detalle

6.6 Uso común de priority_queue

ID de concurso de Codeup: 100000601

Pregunta A: Programación de tareas

Título Descripción
Leer una secuencia de programación de tareas y generar un método de programación adecuado para n tareas.
Entrada La
entrada contiene múltiples conjuntos de datos de prueba.
Ingrese un número entero n (n <100000) en la primera línea de cada grupo, lo que indica que hay n tareas.
En las siguientes n líneas, la primera en cada línea indica la tarea de preordenar Las tareas entre paréntesis son varias tareas de orden posterior, lo que significa que la tarea de orden posterior solo puede comenzar cuando se completa la tarea de orden previa. Si el postorder es NULL, no hay tarea sucesora.
Salida
Método de programación de salida: si hay varios métodos de programación adecuados, envíe el que tenga el orden lexicográfico más pequeño.
Entrada de muestra

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

Salida de muestra

Task0 Task1 Task2 Task3

Pensando en
este problema es claramente una cola de prioridad, con el fin de facilitar el cálculo aquí, he construido una estructura, que contiene el nombre de la tarea y prioridad, y para hacer gran valor menor prioridad, la prioridad es inicializado a cero, así que cada vez Al calcular las tareas posteriores, simplemente agregue 1 a la prioridad de las tareas posteriores.

Mi idea es crear primero un mapa de asignación de cadenas para int , leer y procesar toda la información del tema, aquí debemos prestar atención, al calcular la prioridad de la tarea posterior al pedido, no puede simplemente m [nombre de tarea] ++ En otras palabras, si es simple agregar, task3 es un elemento que nunca ha aparecido, entonces la prioridad de task3 también será 1, lo mismo que task1 y task2).

Debido a que existe un vínculo entre la prioridad de la tarea de pedido anticipado y la tarea de pedido posterior, el cálculo de la prioridad de nuestra tarea de pedido posterior debe basarse en la prioridad de la tarea de pedido anticipado, más 1 para completar el pedido anticipado Construcción de relaciones.

Finalmente, solo use el iterador para recorrer todo el mapa, guarde los valores clave y de valor en la estructura y luego coloque la estructura actual en la cola. Después de que se procesa toda la información del mapa, la cola en este momento es el resultado que queremos, por lo que simplemente podemos atravesar la salida de la cola.

Además, la estructura de juicio de prioridad cmp de la cola no puede simplemente escribir la relación del tamaño del valor de prioridad, porque el título dice que el que tiene el orden lexicográfico más pequeño debe salir, por lo tanto,Cuando las prioridades son iguales, el orden lexicográfico debe establecerse en alta prioridad. Mira el código específicamente ~
código

#include<cstdio>
#include<string.h>
#include<algorithm>
#include<queue>
#include<map>
#include<string>
#include<iostream>
using namespace std;
struct task{
	string TaskName;
	int yxj;//优先级,这里规定小的数为高优先级
	task(){
		TaskName.clear();
		yxj = 0;
	}
};
struct cmp{
	bool operator () (task a, task b){
		if(a.yxj!=b.yxj) return a.yxj>b.yxj;//如果优先级不相等,则小的优先级大 
		else return a.TaskName>b.TaskName;//如果优先级相等,则字母序小的优先级大 
	}
};
map<string, int> m;
priority_queue<task, vector<task>, cmp> q;
int main(){
	int n;
	while(cin>>n){
		for(int i=0;i<n;i++){
			string temp, temptask;
			cin>>temp;
			int left = temp.find("(");
			int right = temp.find(")");
			if(i==0) m[temp.substr(0, left)] = 0;
			for(int i=left+1;i<=right;i++){
				if(temp[i]==','||i==right){
					if(temptask=="NULL") break;
					m[temptask] = m[temp.substr(0, left)]+1;//优先级比前一级低一级 
					temptask.clear();
					continue;
				}
				temptask += temp[i];
			}
		}
		for(map<string, int>::iterator it=m.begin();it!=m.end();it++){
			task tmp;
			tmp.TaskName = it->first;
			tmp.yxj = it->second;
			q.push(tmp);
		}
		for(int i=0;i<n;i++){
			if(i==0){
				cout<<q.top().TaskName;
				q.pop();
			}
			else{
				cout<<" "<<q.top().TaskName;
				q.pop();	
			}
		}
		cout<<endl;
		m.clear();//清空map,注意队列没有clear函数,而且不需要手动清空,pop的时候已经清空了 
	}
	return 0;
}

Resumen

Después de terminar esta gran pregunta, la sensación es similar a la del mapa, pero debido a que el mapa se ordena automáticamente por el valor de la clave de pequeño a grande, y aquí la clave es una cadena, lo que queremos en esta pregunta es el valor. Los valores se ordenan de pequeño a grande, por lo que puede usar unorde_map, y luego poner cada clave y valor en este mapa como un par, ponerlo en el vector y, finalmente, simplemente escribir una función de clasificación para ordenar el vector. Puede cumplir con los requisitos de esta pregunta, pero si puede recordar la escritura de las reglas de clasificación de cola prioritarias (utilizando una estructura o función de amigo ), es más conveniente preferir la cola.

Publicado 54 artículos originales · ganó 27 · vistas 4985

Supongo que te gusta

Origin blog.csdn.net/weixin_42257812/article/details/105329288
Recomendado
Clasificación