Під час складання книг зазвичай потрібно покласти найбільші внизу, а найменші - вгорі. Однак мій прихований 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]]
Я створив їх вручну, тому повідомте мені, якщо ви помітили якісь помилки.