Ao empilhar livros, você geralmente deseja colocar os maiores na parte inferior e os menores na parte superior. No entanto, meu TOC latente me deixa muito desconfortável se tiver dois livros em que um é mais baixo (em altura), mas mais largo que o outro. Independentemente da ordem em que os colocar, o livro superior se estenderá além do livro inferior de um lado.
Como exemplo, digamos que um livro tenha dimensões (10,15)
e outro tenha dimensões (11,14)
. Não importa de que maneira eu os coloque, recebo uma saliência. Mas se eu tiver livros com dimensões (4,3)
e (5,6)
, posso evitar um balanço, colocando o último abaixo do primeiro.
Para os propósitos deste desafio, consideraremos saliências apenas em relação ao livro imediatamente abaixo . Por exemplo, se eu tenho uma pilha (5,5)
, (3,3)
, (4,4)
(não que qualquer pessoa em sã consciência faria isso), as contagens top livro como uma saliência, embora não se estende além do livro de fundo. Da mesma forma, a pilha (3,3)
, (3,3)
, (4,4)
também tem apenas uma saliência, apesar do livro superior estendendo-se para além do inferior.
O desafio
Dada uma lista de pares inteiros para as dimensões do livro, classifique esses pares / livros de modo que o número de saliências seja mínimo. Você não deve girar os livros - eu quero todos os espinhos voltados para a mesma direção. Se houver várias soluções com o mesmo número de balanços, você poderá escolher qualquer ordem desse tipo. Seu algoritmo de classificação não precisa ser estável. Sua implementação pode assumir que as dimensões do livro são menores que 2 16 cada.
Complexidade de tempo: para tornar isso um pouco mais interessante, a pior complexidade assintótica do seu algoritmo deve ser polinomial no tamanho da pilha. Então você não pode simplesmente testar todas as permutações possíveis. Inclua uma prova curta da otimização e complexidade do seu algoritmo e, opcionalmente, um gráfico que mostre a escala para grandes entradas aleatórias. Obviamente, você não pode usar o tamanho máximo da entrada como argumento de que seu código é executado em O (1).
Você pode escrever um programa ou função, receber entradas via STDIN, ARGV ou argumento de função em qualquer formato de lista conveniente (não pré-processado) e imprimir ou retornar o resultado.
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Estou confiante de que existe uma solução polinomial, mas se você puder me provar que está errado, poderá enviar essa prova em vez de uma apresentação de golfe. Nesse caso, você pode assumir P ≠ NP . Vou aceitar a primeira prova correta e conceder uma recompensa a ela.
Exemplos
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]]
Eu os criei à mão, então, deixe-me saber se você encontrar algum erro.