Al apilar libros, generalmente desea colocar los más grandes en la parte inferior y los más pequeños en la parte superior. Sin embargo, mi TOC latente me hace sentir muy incómodo si tengo dos libros donde uno es más corto (en altura) pero más ancho que el otro. No importa en qué orden los coloque, el libro superior se extenderá más allá del libro inferior en un lado.
Como ejemplo, digamos que un libro tiene dimensiones (10,15)
y otro tiene dimensiones (11,14)
. No importa en qué dirección los coloque, me sale un saliente. Pero si tengo libros con dimensiones (4,3)
y (5,6)
, puedo evitar sobresalir colocando el último debajo del primero.
A los fines de este desafío, consideraremos los voladizos solo en relación con el libro que se encuentra a continuación . Por ejemplo, si tengo una pila (5,5)
, (3,3)
, (4,4)
(no es que cualquier persona sana haría eso), los recuentos de libros como un voladizo superior, a pesar de que no se extiende más allá del libro de fondo. Del mismo modo, la pila (3,3)
, (3,3)
, (4,4)
también tiene sólo un voladizo, a pesar del libro superior que se extiende más allá de la parte inferior.
El reto
Dada una lista de pares enteros para las dimensiones de los libros, clasifique esos pares / libros de modo que el número de voladizos sea mínimo. No debe rotar los libros: quiero que todas las espinas estén orientadas en la misma dirección. Si hay varias soluciones con el mismo número de voladizos, puede elegir cualquier orden. Su algoritmo de clasificación no tiene que ser estable. Su implementación puede suponer que las dimensiones del libro son inferiores a 2 16 cada una.
Complejidad del tiempo: para hacer esto un poco más interesante, la complejidad asintótica del peor de los casos de su algoritmo debe ser polinomial en el tamaño de la pila. Por lo tanto, no puede probar cada permutación posible. Incluya una breve prueba de la optimización y complejidad de su algoritmo y, opcionalmente, un gráfico que muestre la escala para entradas aleatorias grandes. Por supuesto, no puede usar el tamaño máximo de la entrada como argumento de que su código se ejecuta en O (1).
Puede escribir un programa o función, recibir información a través de STDIN, ARGV o argumento de función en cualquier formato de lista conveniente (no preprocesado) e imprimir o devolver el resultado.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Estoy seguro de que existe una solución polinómica, pero si puede demostrar que estoy equivocado, puede presentar dicha prueba en lugar de una presentación de golf. En este caso, puede suponer P ≠ NP . Aceptaré la primera prueba correcta y le otorgaré una recompensa.
Ejemplos
In: [[1, 1], [10, 10], [4, 5], [7, 5], [7, 7], [10, 10], [9, 8], [7, 5], [7, 5], [3, 1]]
Out: [[10, 10], [10, 10], [9, 8], [7, 7], [7, 5], [7, 5], [7, 5], [4, 5], [3, 1], [1, 1]]
In: [[4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [5, 4], [4, 5]]
Out: [[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [5, 4]]
or [[5, 4], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5]]
In: [[2, 3], [1, 1], [5, 5], [7, 1]]
Out: [[5, 5], [2, 3], [7, 1], [1, 1]]
or [[5, 5], [2, 3], [1, 1], [7, 1]]
or [[7, 1], [5, 5], [2, 3], [1, 1]]
or [[7, 1], [1, 1], [5, 5], [2, 3]]
Los creé a mano, así que avísame si ves algún error.