Khi xếp sách bạn thường muốn đặt những cuốn lớn nhất ở dưới cùng và những cuốn nhỏ nhất ở trên cùng. Tuy nhiên, OCD tiềm ẩn của tôi khiến tôi cảm thấy rất khó chịu nếu tôi có hai cuốn sách trong đó một cuốn ngắn hơn (chiều cao) nhưng rộng hơn cuốn kia. Bất kể tôi đặt chúng theo thứ tự nào, cuốn sách hàng đầu sẽ mở rộng ra ngoài cuốn sách dưới cùng ở một bên.
Ví dụ: giả sử một cuốn sách có kích thước (10,15)
và cuốn sách khác có kích thước (11,14)
. Bất kể cách nào tôi đặt chúng, tôi đều có phần nhô ra. Nhưng nếu tôi có những cuốn sách có kích thước (4,3)
và (5,6)
, tôi có thể tránh được phần nhô ra bằng cách đặt cái sau bên dưới cái trước.
Đối với mục đích của thử thách này, chúng tôi sẽ xem xét phần nhô ra chỉ liên quan đến cuốn sách ngay bên dưới . Ví dụ: nếu tôi có một ngăn xếp (5,5)
,(3,3)
, (4,4)
(không phải là bất kỳ người nào lành mạnh sẽ làm điều đó), đếm cuốn sách đầu như một nhô ra, mặc dù nó không mở rộng ra ngoài những cuốn sách dưới. Tương tự, ngăn xếp (3,3)
, (3,3)
, (4,4)
cũng chỉ có một nhô ra, mặc dù cuốn sách đầu vượt ra ngoài một đáy.
Các thách thức
Đưa ra một danh sách các cặp số nguyên cho kích thước sách, sắp xếp các cặp / sách đó sao cho số lượng phần nhô ra là tối thiểu. Bạn không được xoay sách - Tôi muốn tất cả các gai quay về cùng một hướng. Nếu có nhiều giải pháp có cùng số lượng nhô ra, bạn có thể chọn bất kỳ thứ tự nào như vậy. Thuật toán sắp xếp của bạn không cần phải ổn định. Việc triển khai của bạn có thể cho rằng kích thước sách nhỏ hơn 2 16 mỗi .
Độ phức tạp thời gian: Để làm cho điều này thú vị hơn một chút, độ phức tạp trong trường hợp xấu nhất của thuật toán của bạn phải là đa thức về kích thước của ngăn xếp. Vì vậy, bạn không thể kiểm tra mọi hoán vị có thể. Vui lòng bao gồm một bằng chứng ngắn về tính tối ưu và độ phức tạp của thuật toán của bạn và tùy ý một âm mưu hiển thị tỷ lệ cho các đầu vào ngẫu nhiên lớn. Tất nhiên, bạn không thể sử dụng kích thước tối đa của đầu vào làm đối số mà mã của bạn chạy trong O (1).
Bạn có thể viết chương trình hoặc hàm, nhận đầu vào qua STDIN, ARGV hoặc đối số hàm theo bất kỳ định dạng danh sách thuận tiện (không được xử lý trước) và in hoặc trả về kết quả.
Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.
Tôi tin tưởng rằng một giải pháp đa thức tồn tại, nhưng nếu bạn có thể chứng minh tôi sai, bạn có thể gửi bằng chứng như vậy thay vì nộp bài đánh gôn. Trong trường hợp này, bạn có thể giả sử P ≠ NP . Tôi sẽ chấp nhận bằng chứng chính xác đầu tiên và trao tiền thưởng cho nó.
Ví dụ
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]]
Tôi đã tạo ra những thứ này bằng tay, vì vậy hãy cho tôi biết nếu bạn phát hiện ra bất kỳ sai lầm nào.