Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- struct paciente {
- int urgencia;
- int idade;
- int ordemChegada;
- paciente (int urgencia, int idade, int ordemChegada): urgencia(urgencia), idade(idade), ordemChegada(ordemChegada) {}
- };
- void bubbleUp (paciente* fila[], int posicaoProblematica){
- while (posicaoProblematica>0 && ( (fila[posicaoProblematica]->urgencia > fila[(posicaoProblematica-1)/2]->urgencia) ||
- (fila[posicaoProblematica]->urgencia == fila[(posicaoProblematica-1)/2]->urgencia && fila[posicaoProblematica]->idade > fila[(posicaoProblematica-1)/2]->idade) ||
- (fila[posicaoProblematica]->urgencia == fila[(posicaoProblematica-1)/2]->urgencia && fila[posicaoProblematica]->idade == fila[(posicaoProblematica-1)/2]->idade
- && fila[posicaoProblematica]->ordemChegada < fila[(posicaoProblematica-1)/2]->ordemChegada) )){
- paciente* pacienteAux = fila[posicaoProblematica];
- fila[posicaoProblematica] = fila[(posicaoProblematica-1)/2];
- fila[(posicaoProblematica-1)/2] = pacienteAux;
- posicaoProblematica = (posicaoProblematica-1)/2;
- }
- }
- int inserir (paciente* fila[], int tamFila, int capacFila, int urgencia, int idade, int ordemChegada){
- auto * pacienteAux = new paciente (urgencia, idade, ordemChegada);
- if (tamFila == capacFila){
- paciente* filaAux [capacFila*2];
- for (int i=0; i<tamFila; i++){
- filaAux[i] = fila[i];
- }
- fila = filaAux;
- capacFila = capacFila*2;
- }
- fila[tamFila] = pacienteAux;
- bubbleUp(fila, tamFila);
- return capacFila;
- }
- void heapify (paciente* fila[], int tamFila, int posicao){
- int l = 2*posicao+1;
- int r = 2*posicao+2;
- int m = posicao;
- if (l<tamFila && ( (fila[l]->urgencia > fila[m]->urgencia) || (fila [l]->urgencia == fila[m]->urgencia && fila[l]->idade > fila[m]->idade) ||
- (fila[l]->urgencia == fila[m]->urgencia && fila[l]->idade == fila[m]->idade && fila[l]->ordemChegada < fila[m]->ordemChegada) ) ){
- m = l;
- }
- if (r<tamFila && ( (fila[r]->urgencia > fila[m]->urgencia) || (fila [r] ->urgencia == fila[m]->urgencia && fila[r]->idade > fila[m]->idade) ||
- (fila[r]->urgencia == fila[m]->urgencia && fila[r]->idade == fila[m]->idade && fila[r]->ordemChegada < fila[m]->ordemChegada) ) ){
- m = r;
- }
- if (m!=posicao){
- paciente* pacienteAux = fila [posicao];
- fila[posicao] = fila[m];
- fila[m] = pacienteAux;
- heapify(fila, tamFila, m);
- }
- }
- paciente* retirar (paciente* fila[], int tamFila){
- paciente* pacienteAux = fila[tamFila-1];
- fila[tamFila-1] = fila[0];
- fila[0] = pacienteAux;
- tamFila -= 1;
- heapify (fila, tamFila, 0);
- return fila[tamFila];
- }
- int main (){
- int numServicos;
- cin >> numServicos;
- int tamFilas [numServicos];
- int capacidadeFilas[numServicos];
- paciente* filasServicos[numServicos][4];
- for (int i=0; i<numServicos; i++){
- tamFilas[i] = 0;
- capacidadeFilas[i] = 4;
- }
- string evento;
- while(cin >> evento && evento!= "END"){
- if (evento == "CIN"){
- int idade, urgencia, servico;
- cin >> idade >> urgencia >> servico;
- int ordemChegada = tamFilas[servico];
- capacidadeFilas[servico] = inserir(filasServicos[servico], tamFilas[servico], capacidadeFilas[servico], urgencia, idade, ordemChegada);
- tamFilas[servico] += 1;
- }
- if (evento == "STD"){
- int servicoAtendido = -1;
- auto * pacienteAtendido = new paciente (-1, -1, -1);
- for (int i=0; i<numServicos; i++){
- if (tamFilas[i] > 0){
- servicoAtendido = i;
- break;
- }
- }
- if (servicoAtendido != -1) {
- for (int i=servicoAtendido; i<numServicos; i++){
- if (tamFilas[i] > 0 &&
- filasServicos[i][0]->urgencia < filasServicos[servicoAtendido][0]->urgencia) {
- servicoAtendido = i;
- }
- }
- pacienteAtendido = retirar(filasServicos[servicoAtendido], tamFilas[servicoAtendido]);
- }
- cout << servicoAtendido << " " << pacienteAtendido->idade << " " << pacienteAtendido->urgencia << endl;
- tamFilas[servicoAtendido] -= 1;
- }
- if (evento == "NXT"){
- int fila;
- cin >> fila;
- int servicoAtendido = -1;
- auto * pacienteAtendido = new paciente (-1, -1, -1);
- if (tamFilas[fila]>0){
- pacienteAtendido = retirar(filasServicos[fila], tamFilas[fila]);
- servicoAtendido = fila;
- tamFilas[fila] -= 1;
- }
- cout << servicoAtendido << " " << pacienteAtendido->idade << " " << pacienteAtendido->urgencia << endl;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement