Advertisement
alinemtg

lista4_paguso

Oct 13th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4.  
  5. struct paciente {
  6.     int urgencia;
  7.     int idade;
  8.     int ordemChegada;
  9.  
  10.     paciente (int urgencia, int idade, int ordemChegada): urgencia(urgencia), idade(idade), ordemChegada(ordemChegada) {}
  11. };
  12.  
  13. void bubbleUp (paciente* fila[], int posicaoProblematica){
  14.     while (posicaoProblematica>0 && (  (fila[posicaoProblematica]->urgencia > fila[(posicaoProblematica-1)/2]->urgencia) ||
  15.             (fila[posicaoProblematica]->urgencia == fila[(posicaoProblematica-1)/2]->urgencia && fila[posicaoProblematica]->idade > fila[(posicaoProblematica-1)/2]->idade) ||
  16.             (fila[posicaoProblematica]->urgencia == fila[(posicaoProblematica-1)/2]->urgencia && fila[posicaoProblematica]->idade == fila[(posicaoProblematica-1)/2]->idade
  17.            && fila[posicaoProblematica]->ordemChegada < fila[(posicaoProblematica-1)/2]->ordemChegada) )){
  18.         paciente* pacienteAux = fila[posicaoProblematica];
  19.         fila[posicaoProblematica] = fila[(posicaoProblematica-1)/2];
  20.         fila[(posicaoProblematica-1)/2] = pacienteAux;
  21.  
  22.         posicaoProblematica = (posicaoProblematica-1)/2;
  23.     }
  24. }
  25.  
  26. int inserir (paciente* fila[], int tamFila, int capacFila, int urgencia, int idade, int ordemChegada){
  27.     auto * pacienteAux = new paciente (urgencia, idade, ordemChegada);
  28.  
  29.     if (tamFila == capacFila){
  30.         paciente* filaAux [capacFila*2];
  31.         for (int i=0; i<tamFila; i++){
  32.             filaAux[i] = fila[i];
  33.         }
  34.         fila = filaAux;
  35.         capacFila = capacFila*2;
  36.     }
  37.  
  38.     fila[tamFila] = pacienteAux;
  39.     bubbleUp(fila, tamFila);
  40.  
  41.     return capacFila;
  42. }
  43.  
  44. void heapify (paciente* fila[], int tamFila, int posicao){
  45.     int l = 2*posicao+1;
  46.     int r = 2*posicao+2;
  47.     int m = posicao;
  48.  
  49.     if (l<tamFila && (  (fila[l]->urgencia > fila[m]->urgencia) || (fila [l]->urgencia == fila[m]->urgencia && fila[l]->idade > fila[m]->idade) ||
  50.                         (fila[l]->urgencia == fila[m]->urgencia && fila[l]->idade == fila[m]->idade && fila[l]->ordemChegada < fila[m]->ordemChegada) ) ){
  51.         m = l;
  52.     }
  53.     if (r<tamFila && (  (fila[r]->urgencia > fila[m]->urgencia) || (fila [r] ->urgencia == fila[m]->urgencia && fila[r]->idade > fila[m]->idade) ||
  54.                              (fila[r]->urgencia == fila[m]->urgencia && fila[r]->idade == fila[m]->idade && fila[r]->ordemChegada < fila[m]->ordemChegada) ) ){
  55.         m = r;
  56.     }
  57.     if (m!=posicao){
  58.         paciente* pacienteAux = fila [posicao];
  59.         fila[posicao] = fila[m];
  60.         fila[m] = pacienteAux;
  61.         heapify(fila, tamFila, m);
  62.     }
  63.  
  64. }
  65.  
  66. paciente* retirar (paciente* fila[], int tamFila){
  67.     paciente* pacienteAux = fila[tamFila-1];
  68.     fila[tamFila-1] = fila[0];
  69.     fila[0] = pacienteAux;
  70.     tamFila -= 1;
  71.     heapify (fila, tamFila, 0);
  72.     return fila[tamFila];
  73. }
  74.  
  75. int main (){
  76.     int numServicos;
  77.     cin >> numServicos;
  78.     int tamFilas [numServicos];
  79.     int capacidadeFilas[numServicos];
  80.     paciente* filasServicos[numServicos][4];
  81.  
  82.     for (int i=0; i<numServicos; i++){
  83.         tamFilas[i] = 0;
  84.         capacidadeFilas[i] = 4;
  85.     }
  86.  
  87.     string evento;
  88.  
  89.     while(cin >> evento && evento!= "END"){
  90.  
  91.         if (evento == "CIN"){
  92.             int idade, urgencia, servico;
  93.             cin >> idade >> urgencia >> servico;
  94.             int ordemChegada = tamFilas[servico];
  95.             capacidadeFilas[servico] = inserir(filasServicos[servico], tamFilas[servico], capacidadeFilas[servico], urgencia, idade, ordemChegada);
  96.             tamFilas[servico] += 1;
  97.         }
  98.  
  99.         if (evento == "STD"){
  100.             int servicoAtendido = -1;
  101.             auto * pacienteAtendido = new paciente (-1, -1, -1);
  102.             for (int i=0; i<numServicos; i++){
  103.                 if (tamFilas[i] > 0){
  104.                     servicoAtendido = i;
  105.                     break;
  106.                 }
  107.             }
  108.             if (servicoAtendido != -1) {
  109.                 for (int i=servicoAtendido; i<numServicos; i++){
  110.                     if (tamFilas[i] > 0 &&
  111.                         filasServicos[i][0]->urgencia < filasServicos[servicoAtendido][0]->urgencia) {
  112.                         servicoAtendido = i;
  113.                     }
  114.                 }
  115.                 pacienteAtendido = retirar(filasServicos[servicoAtendido], tamFilas[servicoAtendido]);
  116.             }
  117.  
  118.             cout << servicoAtendido << " " << pacienteAtendido->idade << " " << pacienteAtendido->urgencia << endl;
  119.             tamFilas[servicoAtendido] -= 1;
  120.         }
  121.  
  122.         if (evento == "NXT"){
  123.             int fila;
  124.             cin >> fila;
  125.             int servicoAtendido = -1;
  126.             auto * pacienteAtendido = new paciente (-1, -1, -1);
  127.  
  128.             if (tamFilas[fila]>0){
  129.                 pacienteAtendido = retirar(filasServicos[fila], tamFilas[fila]);
  130.                 servicoAtendido = fila;
  131.                 tamFilas[fila] -= 1;
  132.             }
  133.             cout << servicoAtendido << " " << pacienteAtendido->idade << " " << pacienteAtendido->urgencia << endl;
  134.         }
  135.  
  136.     }
  137.  
  138.     return 0;
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement