책을 쌓을 때 일반적으로 가장 큰 책을 맨 아래에 놓고 가장 작은 책을 맨 위에 놓습니다. 그러나 잠복 OCD를 사용하면 두 권의 책 중 하나는 짧지 만 (높이는) 다른 책보다 넓은 경우 매우 불안합니다. 어떤 순서로 주문하든 맨 위의 책은 한 쪽의 맨 아래 책을 넘어 확장됩니다.
예를 들어 한 책에 치수가 (10,15)
있고 다른 책에 치수 가 있다고 가정합니다 (11,14)
. 어떤 식 으로든 아무리 두어도 오버행이 발생합니다. 그러나 치수가 (4,3)
및 (5,6)
인 책이있는 경우 책을 책 아래에 배치하여 돌출부를 피할 수 있습니다.
이 도전의 목적을 위해 우리는 바로 아래 의 책과 관련해서 만 돌출부를 고려할 것 입니다. 예 내가 스택이있는 경우 (5,5)
, (3,3)
, (4,4)
(제정신 사람이 할 것하지 않는 것이), 오버행 등 상위 책 수는, 그것은 아래 책을 넘어 확장되지 않지만. 마찬가지로, 스택 (3,3)
, (3,3)
, (4,4)
또한 하단 하나를 넘어 확장 상단 책에도 불구하고, 단 하나의 오버행이있다.
도전
책 치수에 대한 정수 쌍 목록이 제공되면 돌출부 수가 최소화되도록 해당 쌍 / 책을 정렬하십시오. 당신은 책을 회전해서는 안됩니다-나는 모든 쪽이 같은 방향을 향하게하고 싶습니다. 오버행 수가 동일한 솔루션이 여러 개인 경우 해당 순서를 선택할 수 있습니다. 정렬 알고리즘이 안정적 일 필요는 없습니다. 구현시 책 크기가 각각 2 16 미만이라고 가정 할 수 있습니다 .
시간 복잡성 : 이 기능을 좀 더 흥미롭게 만들려면 알고리즘의 가장 복잡한 최악의 복잡성은 스택 크기에서 다항식이어야합니다. 따라서 가능한 모든 순열을 테스트 할 수는 없습니다. 알고리즘의 최적 성과 복잡성에 대한 간단한 증거와 선택적으로 큰 임의의 입력에 대한 스케일링을 보여주는 플롯을 포함하십시오. 물론 최대 크기의 입력을 코드가 O (1)에서 실행되는 인수로 사용할 수 없습니다.
프로그램이나 함수를 작성하고 STDIN, ARGV 또는 함수 인수를 통해 편리한 (전처리되지 않은) 목록 형식으로 입력 한 후 결과를 인쇄하거나 반환 할 수 있습니다.
이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.
나는 다항식 솔루션이 존재한다고 확신하지만, 당신이 나를 잘못 증명할 수 있다면, 골프 제출 대신에 그러한 증거를 제출할 수 있습니다. 이 경우 P ≠ NP로 가정 할 수 있습니다 . 나는 첫 번째 올바른 증거를 받아들이고 그에 대한 현상금을 수여합니다.
예
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]]
나는 이것을 손으로 만들었으므로 실수를 발견하면 알려주십시오.