█████████ ████ ███░░░░░███ ░░███ ███ ░░░ ██████ ███████ ██████ ██████ ░███ ███░░███ ███░░███ ███░░███ ███░░███ ░███ ░███ ░███░███ ░███ ░███████ ░███ ░███ ░░███ ███░███ ░███░███ ░███ ░███░░░ ░███ ░███ ░░█████████ ░░██████ ░░████████░░██████ ░░██████ ░░░░░░░░░ ░░░░░░ ░░░░░░░░ ░░░░░░ ░░░░░░

Envío 3941

Problema 0xcf - Mirando al horizonte

  • Autor: bryancalisto
  • Fecha: 2021-04-24 03:23:40 UTC (Hace alrededor de 3 años)
Caso # Resultado Tiempo Memoria
#1
Correcto
0.004 s 7 KBi
#2
Correcto
0.004 s 72 KBi
#3
Correcto
0.004 s 2 KBi
#4
Correcto
0.004 s 71 KBi
#5
Correcto
0.005 s 1 KBi
#6
Correcto
0.2 s 6 KBi
#7
Correcto
0.187 s 7 KBi
#8
Correcto
0.189 s 7 KBi
#9
Correcto
0.202 s 6 KBi
#10
Correcto
0.209 s 74 KBi
Puntos totales: 100 / 100

Código

#include <bits/stdc++.h>

using namespace std;

int main()
{
  int c, n, i, j, *alturas, num;

  scanf(" %d", &c);

  for (i = 0; i < c; i++)
  {
    // INPUT
    scanf("%d", &n);
    alturas = (int *)malloc(sizeof(int) * n);
    vector<int> res(n);
    stack<int> pila;

    for (j = 0; j < n; j++)
    {
      scanf(" %d", &alturas[j]);
    }

    printf("Case #%d: ", i + 1);

    // ALGORITMO
    for (j = n - 1; j >= 0; j--)
    {
      pila.push(alturas[j]);

      // revisamos si el edificio actual es menos alto que los edificios al horizonte
      while (pila.size() && alturas[j] >= pila.top())
      {
        pila.pop();
      }

      // El ultimo edificio nunca tiene quien le estorbe
      if (!pila.size())
      {
        res[j] = -1;
      }
      // No es el ultimo edificio asi que quien le estorba es el edificio mas alto mas cercano
      else
      {
        res[j] = pila.top();
      }

      pila.push(alturas[j]);
    }

    for (j = 0; j < n; j++)
    {
      printf("%d ", res[j]);
    }

    printf("\n");
    free(alturas);
  }

  return 0;
}