Programacion, ACM ICPC, UVa Online Judge

Entradas etiquetadas como ‘Greedy’

UVa Online Judge – 11824 – A Minimum Land Price

El link del problema es el siguiente:
11824 – A Minimum Land Price

El problema es de tipo Greedy, y requiere un ordenamiento.
En cada caso, nosotros tenemos un conjunto de números, y hay que hacer que la sumatoria siguiente se minimice.
Para minimizarla, hay que leer todos los datos y ordenarlos de mayor a menor.
Esto se debe a que al ir elevando a la potencia i, el numero crece mas rápidamente  entonces, es conveniente elevar a los números mas grandes a una potencia pequeña.
Si en medio del proceso, el numero excede 5,000,000, imprimir «Too expensive», de lo contrario, imprimir el valor obtenido.

Código en C++

UVa Online Judge – 11039 – Building designing

El link del problema es el siguiente:
11039 – Building designing

El problema es de tipo Greedy.
Nos dicen que tenemos que formar el edificio mas alto que se pueda, con la condición que siempre hay que ir alternando los colores y que el piso de abajo tiene que ser mayor al piso que se coloca arriba.
Un color es representado como positivo y otro como negativo y el tamaño de cada piso es el valor absoluto del numero.

Una solución es guardar los valores en 2 arreglos, uno para los números positivos y otro para los números negativos y ordenarlos.
Una vez ordenados, tomamos el elemento mas grande de los 2, ya sea o positivo y negativo.
Y por ultimo, hay que ir alternando, ya que si el piso de abajo es positivo, el siguiente tiene que ser negativo, así que hay que encontrar el numero mas pequeño que le sigue al numero del piso anterior.
Este proceso se hace igual al revés, si el ultimo es negativo, hay que tomar el siguiente positivo y buscar el siguiente numero menor al valor del piso anterior.
El resultado es el numero máximo de pisos que pudimos encadenar.

Código en C++

UVa Online Judge – 120 – Stacks of Flapjacks

El link del problema es el siguiente:
120 – Stacks of Flapjacks

El problema es de Ordenamiento.
Lo que nos piden es, dada una torre de panques desordenada, ordenarla de mayor a menor, pero con una forma peculiar de ordenar.

La forma del ordenamiento consiste en colocar la espátula en una posición y girar todos los panques que se encuentren desde ese punto hasta la cima de la torre y voltear todos los panques.
En el problema no especifica un método optimo para resolver el problema, así que una de las maneras mas fácil de resolver el problema es dividirlo en 2 casos bases:

  • El panque mas grande que no este ordenado, no se encuentra hasta arriba
  • El panque mas grande que no este ordenado, se encuentra hasta arriba

Como podrán notar, al usar esos 2 casos bases, nos daremos cuenta que para ordenar cualquier panque a lo mas se necesitan 2 movimientos, colocarlo hasta arriba y voltear luego al nivel que corresponda.
Ejemplo:

Entrada:
1 2 3 5 4
Salida
2 1 2 3 0

Los movimientos para obtener la salida se pueden interpretar de la siguiente manera:
1                  5                 4                 3                 1
2  flip(2)       3   flip(1)     1   flip(2)     2   flip(3)     2
3  ——>      2   ——>     2   ——>    1   ——>    3
5                  1                 3                 4                 4
4                  4                 5                 5                 5

Si se dan cuenta, se coloca siempre el mas grande y después se voltean y se coloca en su posición correspondiente.
Hay que aclarar que hay que copiar los elementos y ordenarlos para saber que elemento no esta en su lugar.

Código en C++