Advertisement
Guest User

LOOOPPP

a guest
Sep 18th, 2019
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int Dmax1 = 0, Dmax2 = 0;
  6.  
  7. int posicaoInicial(string placa, int tamanhoEsAtual) {
  8.     int somador = 0;
  9.     for (int i = 0; i < placa.length(); i++) {
  10.         somador += (placa[i] - (int) 'A') * pow(26, i);
  11.     }
  12.     return somador % tamanhoEsAtual;
  13. }
  14.  
  15. typedef struct carro {
  16.     string placa = "vazio";
  17.     int deslocamento = -1;
  18.  
  19. }carro;
  20.  
  21. struct Estacionamento1 {
  22.     carro *realocacao(carro *parkOld, int novoTamanho, int antigoTamanho) {
  23.  
  24.         carro *newPark = new carro[novoTamanho];
  25.  
  26.         for(int i = 0; i < novoTamanho; i++) newPark[i] = carro();
  27.  
  28.         for (int i = 0; i < antigoTamanho; i++) {
  29.             if (parkOld[i].placa != "vazio" && parkOld[i].placa != "off") {         //Se for uma posicao vazia ou indisponivel, n realoca
  30.                 int aux = posicaoInicial(parkOld[i].placa, novoTamanho);
  31.  
  32.                 if (newPark[aux].placa == "vazio") {
  33.                     parkOld[i].deslocamento = 0;
  34.                     newPark[aux] = parkOld[i];
  35.  
  36.                 } else {
  37.                     parkOld[i].deslocamento = 0;
  38.                     aux = (aux + 1) % novoTamanho;
  39.                     while (newPark[aux].placa != "vazio") {
  40.                         parkOld[i].deslocamento++;
  41.                         aux = (aux + 1) % novoTamanho;
  42.                     }
  43.                     newPark[aux] = parkOld[i];
  44.                 }
  45.             }
  46.         }
  47.         return newPark;
  48.     }
  49.  
  50.     void IN(carro *park, int tamanhoAtual, carro dirigivel) {
  51.         int aux = posicaoInicial(dirigivel.placa, tamanhoAtual);
  52.  
  53.         if (park[aux].placa == "vazio") {
  54.             park[aux] = dirigivel;
  55.             cout << aux << " " << park[aux].deslocamento << " ";
  56.  
  57.         } else {
  58.             while (park[aux].placa != "vazio") {
  59.                 dirigivel.deslocamento++;
  60.                 aux = (aux + 1) % tamanhoAtual;
  61.             }
  62.             park[aux] = dirigivel;
  63.             cout << aux << " " << park[aux].deslocamento << " ";
  64.         }
  65.     }
  66.  
  67.     void OUTSRC(carro *park, int tamanhoAtual, string placa, bool remocao) {
  68.         int aux = posicaoInicial(placa, tamanhoAtual);
  69.  
  70.         int tempoBusca = 0;
  71.  
  72.         if (park[aux].placa == placa) {
  73.             if (remocao) park[aux].placa = "off";                     //SE FOR UMA REMOCAO
  74.             else if (tempoBusca > Dmax1) Dmax1 = tempoBusca;           //SE FOR UMA BUSCA
  75.             cout << aux << " " << tempoBusca << " ";
  76.  
  77.         } else {
  78.             bool stop = false;
  79.             while(!stop){      //JA COMECA NA PROXIMA POSICAO
  80.                 aux = (aux+1)%tamanhoAtual;
  81.                 tempoBusca++;
  82.  
  83.                 if (park[aux].placa == "vazio") {
  84.                     cout << "-1 -1 ";
  85.  
  86.                     stop = true;
  87.  
  88.                 } else if (park[aux].placa == placa) {
  89.                     if (remocao) {                                //SE FOR UMA REMOCAO
  90.                         park[aux].placa = "off";
  91.  
  92.                     } else {
  93.                         if (tempoBusca > Dmax1) Dmax1 = tempoBusca;
  94.                     }
  95.                     cout << aux << " " << tempoBusca << " ";
  96.                     stop = true;
  97.                 }
  98.             }
  99.         }
  100.     }
  101. };
  102.  
  103. struct Estacionamento2 {
  104.     carro *realocacao(carro *parkOld, int novoTamanho, int antigoTamanho) {
  105.         carro *newPark = new carro[novoTamanho];
  106.  
  107.         for (int i = 0; i < antigoTamanho; i++) {
  108.             if (parkOld[i].placa != "vazio" && parkOld[i].placa != "off") {
  109.                 int aux = posicaoInicial(parkOld[i].placa, novoTamanho);
  110.  
  111.                 if (newPark[aux].placa == "vazio") {
  112.                     parkOld[i].deslocamento = 0;
  113.                     newPark[aux] = parkOld[i];
  114.  
  115.                 } else {
  116.                     parkOld[i].deslocamento = 0;
  117.  
  118.                     while (newPark[aux].placa != "vazio") {
  119.                         if (newPark[aux].deslocamento < parkOld[i].deslocamento) {
  120.                             carro temp = newPark[aux];
  121.                             newPark[aux] = parkOld[i];
  122.  
  123.                             parkOld[i] = temp;
  124.                         }
  125.                         aux = (aux + 1) % novoTamanho;
  126.                         parkOld[i].deslocamento++;
  127.                     }
  128.                     newPark[aux] = parkOld[i];
  129.                 }
  130.             }
  131.         }
  132.         return newPark;
  133.     }
  134.  
  135.     void IN(carro *park, int tamanhoAtual, carro dirigivel) {
  136.         int aux = posicaoInicial(dirigivel.placa, tamanhoAtual);
  137.  
  138.         if (park[aux].placa == "vazio") {
  139.             park[aux] = dirigivel;
  140.             cout << aux << " " << dirigivel.deslocamento << endl;
  141.  
  142.         } else {
  143.             int trocas = 0;
  144.             while (park[aux].placa != "vazio") {
  145.                 if (park[aux].placa != "off" && park[aux].deslocamento < dirigivel.deslocamento) {
  146.                     carro temp = park[aux];
  147.                     park[aux] = dirigivel;
  148.  
  149.  
  150.                     if(trocas == 0) cout << aux << " " << dirigivel.deslocamento << endl;
  151.                     trocas++;
  152.  
  153.                     dirigivel = temp;
  154.                 }
  155.                 aux = (aux + 1) % tamanhoAtual;
  156.                 dirigivel.deslocamento++;
  157.             }
  158.             park[aux] = dirigivel;
  159.             if(trocas == 0) cout << aux << " " << dirigivel.deslocamento << endl;
  160.         }
  161.     }
  162.     void OUTSRC(carro *park, int tamanhoAtual, string placa, bool remocao) {
  163.         int aux = posicaoInicial(placa, tamanhoAtual);
  164.  
  165.         int tempoBusca = 0;
  166.  
  167.         if (park[aux].placa == placa) {
  168.  
  169.             if (remocao) park[aux].placa = "off";                         //SE FOR UMA REMOCAO
  170.             else if (tempoBusca > Dmax1) Dmax1 = tempoBusca;
  171.  
  172.             cout << aux << " " << tempoBusca << endl;
  173.  
  174.         } else {
  175.             bool stop = false;
  176.             while(!stop) {      //JA COMECA NA PROXIMA POSICAO
  177.                 aux = (aux+1)%tamanhoAtual;
  178.                 tempoBusca++;
  179.  
  180.                 if (park[aux].placa == "vazio") {
  181.                     cout << "-1 -1" << endl;
  182.  
  183.                     stop = true;
  184.  
  185.                 } else if (park[aux].placa == placa) {
  186.                     if (remocao) {                                //SE FOR UMA REMOCAO
  187.                         park[aux].placa = "off";
  188.  
  189.                     } else {
  190.                         if (tempoBusca > Dmax2) Dmax2 = tempoBusca;
  191.                     }
  192.                     cout << aux << " " << tempoBusca << endl;
  193.                     stop = true;
  194.                 }
  195.             }
  196.         }
  197.     }
  198. };
  199.  
  200. int main() {
  201.     ios::sync_with_stdio(false);
  202.     cin.tie(0);
  203.  
  204.     int Mmin, Fmin, Fmax;
  205.     cin >> Mmin >> Fmin >> Fmax;
  206.  
  207.     carro *park1 = new carro[Mmin];
  208.     carro *park2 = new carro[Mmin];
  209.  
  210.     Estacionamento1 estacionamento1;
  211.     Estacionamento2 estacionamento2;
  212.  
  213.     int vagasOcupadas = 0;                                      //REALMENTE OCUPADAS + INDISPONIVEIS
  214.     int vagasIndisp = 0;                                        //VAGAS INDISPONIVEIS
  215.     int m = Mmin;
  216.  
  217.     int contador = 0;
  218.  
  219.     string comando, placa;
  220.     cin >> comando;
  221.  
  222.     while (comando != "END") {
  223.         cin >> placa;
  224.  
  225.         if (comando == "IN") {
  226.  
  227.             if (100 * (vagasOcupadas + vagasIndisp) > m * Fmax)              //TAXA DE OCUPACAO
  228.             {
  229.                 park1 = estacionamento1.realocacao(park1, m * 2, m);        //RECEBE UM NOVO ARRAY
  230.                 park2 = estacionamento2.realocacao(park2, m * 2, m);
  231.                 m *= 2;
  232.  
  233.                 vagasIndisp = 0;
  234.             }
  235.  
  236.             carro novo;                                                         //CRIA UM OBJ DO TIPO CARROS
  237.             novo.placa = placa;
  238.             novo.deslocamento = 0;
  239.  
  240.             estacionamento1.IN(park1, m, novo);
  241.             estacionamento2.IN(park2, m, novo);
  242.             vagasOcupadas++;
  243.  
  244.         } else if (comando == "OUT") {
  245.             estacionamento1.OUTSRC(park1, m, placa, true);
  246.             estacionamento2.OUTSRC(park2, m , placa, true);
  247.  
  248.             vagasIndisp++;
  249.             vagasOcupadas--;
  250.  
  251.             if (m > Mmin && 100 * vagasOcupadas < m * Fmin) {
  252.                 park1 = estacionamento1.realocacao(park1, m / 2, m);           //RECEBE UM NOVO ARRAY
  253.                 park2 = estacionamento2.realocacao(park2, m / 2, m);           //RECEBE UM NOVO ARRAY
  254.                 m /= 2;
  255.  
  256.                 vagasIndisp = 0;
  257.             }
  258.  
  259.         } else {
  260.             estacionamento1.OUTSRC(park1, m, placa, false);
  261.             estacionamento2.OUTSRC(park2, m, placa, false);
  262.         }
  263.         cin >> comando;
  264.     }
  265.     cout << Dmax1 << " " << Dmax2 << endl;
  266.     return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement