Sách trên kệ


12

Tôi có một số sách và một kệ sách. Tôi muốn đặt càng nhiều sách lên kệ càng tốt nhưng tôi có một quy tắc. Tất cả các kích thước của sách (chiều cao, chiều rộng và chiều sâu) sẽ tạo thành một chuỗi không tăng trên giá.

Điều này có nghĩa là mọi cuốn sách đều phải cao ít nhất là những cuốn sách sau nó. Tương tự như vậy đối với chiều rộng và chiều sâu. Bạn không thể xoay sách để hoán đổi chiều cao, chiều rộng và chiều sâu của chúng.

Bạn nên viết một chương trình hoặc chức năng đưa ra kích thước của tất cả các sách làm đầu ra đầu vào hoặc trả về số lượng sách tối đa tôi có thể đặt trên giá.

Đầu vào

  • Danh sách các bộ ba số nguyên dương trong đó mỗi bộ ba xác định chiều cao, chiều rộng và chiều sâu của một cuốn sách.
  • Sẽ có ít nhất một bộ ba trong danh sách đầu vào.
  • Hai cuốn sách có thể có cùng độ dài dọc theo bất kỳ số lượng kích thước nào.

Đầu ra

  • Một số nguyên dương duy nhất, số lượng sách tối đa phù hợp trên giá tuân theo quy tắc.

Thời gian phức tạp

Thuật toán của bạn nên có đa thức độ phức tạp trong trường hợp xấu nhất trong số lượng sách. Điều này có nghĩa là các ví dụ về độ phức tạp thời gian sau đây đều hợp lệ: O (N ^ 3), O (log (N) * N ^ 2), O (N) và các độ phức tạp sau không hợp lệ: O (2 ^ N), O (N!), O (N ^ N).

Ví dụ

Đầu vào => Đầu ra

(1, 1, 1) =>  1

(5, 2, 5), (1, 3, 5) =>  1

(5, 2, 5), (1, 2, 5) =>  2

(2, 2, 2), (2, 2, 2), (2, 2, 2), (1, 3, 6) =>  3

(1, 2, 5), (1, 3, 5), (1, 2, 8), (1, 2, 5), (7, 7, 7) =>  4

(5, 19, 3), (9, 4, 16), (15, 16, 13), (7, 4, 16), (1, 13, 14), (20, 1, 15), (9, 8, 19), (4, 11, 1) =>  3

(1, 1, 18), (1, 13, 7), (14, 1, 17), (8, 15, 16), (18, 8, 12), (8, 8, 15), (10, 1, 14), (18, 4, 6), (10, 4, 11), (17, 14, 17), (7, 10, 10), (19, 16, 17), (13, 19, 2), (16, 8, 13), (14, 6, 12), (18, 12, 3) =>  5

Đây là mã golf nên mục ngắn nhất sẽ thắng.

Một thử thách sắp xếp cuốn sách thú vị liên quan: Sắp xếp sách .


Bạn có nghĩa là nó sẽ tạo thành một chuỗi giảm? Đó là những gì bạn nhận được nếu mỗi cuốn sách ít nhất cao bằng cuốn sách sau nó, trừ khi mọi cuốn sách có cùng chiều cao.
mbomb007

@ mbomb007 Đúng, đã thay đổi "không giảm" thành "không tăng".
Randomra

Câu trả lời:


4

Python 3: 436 byte

Lúc đầu, tôi thấy đây là vấn đề hoàn chỉnh của NP trong việc tìm đường dẫn đơn giản dài nhất trong đồ thị hướng với các chu kỳ. Tuy nhiên, mọi chu kỳ trong biểu đồ (thực sự là một sơ đồ con hoàn chỉnh) có thể được biểu diễn dưới dạng một đỉnh đơn. Nói cách khác, coi những cuốn sách giống hệt như một cuốn sách, được đặt trên kệ như một đơn vị. Sau đó, chúng ta có thể xây dựng một biểu đồ chu kỳ có hướng trong đó a-> b có nghĩa là b có thể theo a trên giá. Cuối cùng, chúng tôi tìm thấy chiều cao tối đa của (các) cây ngoài bằng phương pháp đệ quy.

import sys
b=[]
n={}
r=[]
for L in sys.stdin.readlines():z=[int(x)for x in L.split()];r+=[z];z in b or b+=[z]
def l(a,b):return a[0]<=b[0]and a[1]<=b[1]and a[2]<=b[2]
R=range(len(b))
for i in R: 
    n[i]=[]
    for j in R:i!=j and l(b[i],b[j])and n[i]+=[j]
def L(t):
    global v;best=0
    if t in v:
            return v[t]
    for s in n[t]:best=max(best,L(s)+1)
    v[t]=best+r.count(b[t])-1;return best
m=0
for i in R:v={};m=max(L(i)+1,m)
print(m)

1
Đây là một giải pháp tốt, nhưng nó chưa thực sự được đánh gôn. Tôi sẽ nâng cấp một khi nó là.
isaacg

3

Bình thường, 40 byte

KYleolNe.eaK+e+]])olNf.A.eg@YbZeT<Kk]YSQ

Không nhanh, nhưng nó là đa thức.

Tương đương Python3:

def num_books(l):
    l = sorted(l)
    s = []
    for i, Y in enumerate(l):
        s.append(max([T for T in s[:i]
                      if all(Y[e] >= t for e, t in enumerate(T[-1]))] + [[]],
                     key=len) + [Y])
    return max(len(u) for u in s)

Phiên bản Python 3 là 177 byte với các gôn rõ ràng. Chỉ là một fyi.
mbomb007

0

Python 2, 231 byte

Hãy thử nó ở đây

Chương trình của tôi hiện đang nhận được hai ví dụ cuối sai. Ai đó có thể giúp tôi sửa nó không? Cảm ơn.

Tôi sắp xếp danh sách tất cả 6 thứ tự hoán vị có thể có của 3 chiều, sau đó xem mối quan hệ thứ tự liên tục dài nhất trong danh sách, sau đó tìm tối đa của các thứ tự đó.

Ngoài ra, tôi biết nếu có thể chơi golf nhiều hơn nữa, nhưng tôi không thể biết liệu tôi có thể sử dụng reduceđể làm điều này không. Nói một cách đơn giản, cách này là dễ nhất để thực hiện trong một thời gian hợp lý mà không cần não tôi nổ tung.

from operator import*
from itertools import*
def f(t):
    m=1
    for l in(sorted(t,key=itemgetter(*o))for o in permutations(range(3))):
        c=1
        for k in range(len(l)-1):
            c+=all(i<=j for i,j in zip(l[k],l[k+1]))
        m=max(m,c)
    print m
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.