หนังสือบนหิ้ง


12

ฉันมีหนังสือและชั้นวางหนังสือ ฉันต้องการวางหนังสือให้มากที่สุดเท่าที่จะทำได้ แต่ฉันมีกฎ ทุกมิติของหนังสือ (ความสูงความกว้างและความลึก) ควรเป็นลำดับที่ไม่เพิ่มขึ้นบนชั้นวาง

ซึ่งหมายความว่าหนังสือทุกเล่มจะต้องสูงอย่างน้อยที่สุดเท่าที่จะเป็นไปได้ เช่นเดียวกันกับความกว้างและความลึก คุณไม่สามารถหมุนหนังสือเพื่อสลับความสูงความกว้างและความลึกของหนังสือได้

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่กำหนดขนาดของหนังสือทั้งหมดเป็นเอาท์พุทอินพุตหรือส่งกลับจำนวนสูงสุดของหนังสือที่ฉันสามารถวางบนชั้นวาง

อินพุต

  • รายการจำนวนเต็มสามเท่าของจำนวนเต็มบวกที่แต่ละ triplet กำหนดความสูงความกว้างและความลึกของหนังสือ
  • จะมีอย่างน้อยหนึ่ง triplet ในรายการอินพุต
  • หนังสือสองเล่มสามารถมีความยาวเท่ากันตามจำนวนมิติใด ๆ

เอาท์พุต

  • จำนวนเต็มบวกเดียวจำนวนสูงสุดของหนังสือที่พอดีกับชั้นวางที่เป็นไปตามกฎ

ความซับซ้อนของเวลา

อัลกอริทึมของคุณควรมีพหุนามความซับซ้อนเวลากรณีเลวร้ายที่สุดในจำนวนหนังสือ ซึ่งหมายความว่าตัวอย่างเช่นความซับซ้อนของเวลาต่อไปนี้เป็นสิ่งที่ถูกต้องทั้งหมด: O (N ^ 3), O (บันทึก (N) * N ^ 2), O (N) และสิ่งต่อไปนี้ไม่ถูกต้อง: O (2 ^ N), O (N!), O (N ^ N)

ตัวอย่าง

อินพุต => เอาท์พุท

(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

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ

เป็นหนังสือที่น่าสนใจท้าทายการเรียงลำดับที่เกี่ยวข้อง: หนังสือกองเรียง


คุณหมายถึงมันควรจะเป็นลำดับที่ลดลงหรือไม่? นั่นคือสิ่งที่คุณจะได้รับถ้าหนังสือแต่ละเล่มสูงอย่างน้อยเท่ากับหนังสือหลังจากนั้นเว้นแต่หนังสือทุกเล่มจะมีความสูงเท่ากัน
mbomb007

@ mbomb007 ขวาเปลี่ยน "ไม่ลด" เป็น "ไม่เพิ่ม"
randomra

คำตอบ:


4

Python 3: 436 ไบต์

ตอนแรกฉันเห็นสิ่งนี้เป็นปัญหาที่สมบูรณ์แบบของการหาเส้นทางที่ง่ายที่สุดที่ยาวที่สุดในกราฟกำกับที่มีวัฏจักร อย่างไรก็ตามทุกรอบในกราฟ (อันที่จริงกราฟย่อยสมบูรณ์) สามารถแสดงเป็นจุดสุดยอดเดียว กล่าวอีกนัยหนึ่งให้ถือว่าหนังสือที่เหมือนกันเป็นหนังสือเล่มเดียวที่จะวางบนชั้นวางของเป็นหน่วย จากนั้นเราสามารถสร้างกราฟที่กำกับโดยที่ a-> b หมายถึง b สามารถติดตามบนหิ้ง ในที่สุดเราพบความสูงสูงสุดของต้นไม้ออกโดยใช้วิธีการเรียกซ้ำ

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
นี่เป็นทางออกที่ดี แต่ยังไม่ได้เล่นกอล์ฟจริงๆ ฉันจะลงคะแนนเมื่อมันเป็น
isaacg

3

Pyth, 40 ไบต์

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

ไม่เร็ว แต่มันเป็นพหุนาม

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)

รุ่น Python 3 มีขนาด 177 ไบต์พร้อมสนามกอล์ฟที่ชัดเจน เพียงแค่ fyi
mbomb007

0

Python 2, 231 ไบต์

ลองที่นี่

ขณะนี้โปรแกรมของฉันทำผิดสองตัวอย่างสุดท้าย ใครช่วยฉันแก้ไขได้มั้ย ขอบคุณ

ฉันเรียงลำดับรายการการเรียงลำดับการเรียงลำดับที่เป็นไปได้ทั้งหมด 6 รายการจาก 3 มิติจากนั้นดูความสัมพันธ์การเรียงลำดับแบบต่อเนื่องที่ยาวที่สุดที่อยู่ในรายการจากนั้นหาค่าสูงสุดของลำดับเหล่านั้น

นอกจากนี้ฉันรู้ว่าสามารถตีกอล์ฟได้มากขึ้นหรือไม่ แต่ฉันไม่สามารถคิดออกได้ว่าฉันสามารถใช้reduceทำสิ่งนี้ได้หรือไม่ พูดง่ายๆคือวิธีนี้เป็นวิธีที่ง่ายที่สุดในการทำในเวลาที่เหมาะสมโดยที่สมองของฉันไม่ระเบิด

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.