棚の本


12

本と本棚があります。できるだけ多くの本を棚に置きたいのですが、ルールがあります。ブックのすべての寸法(高さ、幅、深さ)は、シェルフ上で増加しないシーケンスを形成する必要があります。

これは、すべての本が少なくともそれ以降の本と同じ高さでなければならないことを意味します。同じことが幅と深さについても言えます。本を回転して高さ、幅、奥行きを入れ替えることはできません。

すべての書籍の寸法を入力出力として指定するか、棚に置くことができる書籍の最大数を返すプログラムまたは関数を作成する必要があります。

入力

  • 正の整数のトリプレットのリスト。各トリプレットは本の高さ、幅、深さを定義します。
  • 入力リストには少なくとも1つのトリプレットがあります。
  • 2冊の本は、任意の数の次元に沿って同じ長さを持つことができます。

出力

  • 単一の正の整数、ルールに従って棚に収まる本の最大数。

時間の複雑さ

アルゴリズムには、書籍の数が最悪の場合の時間複雑度多項式が必要です。これは、たとえば、次の時間計算量がすべて有効であることを意味します:O(N ^ 3)、O(log(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

これはコードゴルフなので、最短のエントリーが勝ちます。

関連する興味深い本の並べ替えの課題:Book Stack Sort


減少するシーケンス形成する必要があるということですか?すべての本が同じ高さでない限り、各本が少なくともそれ以降の本と同じ高さであれば、それが得られます。
mbomb007

@ mbomb007そう、「非減少」を「非増加」に変更しました。
-randomra

回答:


4

Python 3:436バイト

最初、これは、サイクルを持つ有向グラフ最も長い単純なパスを見つけるNP完全な問題であると考えました。ただし、グラフ内のすべてのサイクル(実際には完全なサブグラフ)は、単一の頂点として表すことができます。言い換えると、同一の本を1つの本として扱い、棚の上にユニットとして配置します。次に、a-> bがbが棚上でaを追跡できることを意味する有向非巡回グラフを構築できます。最後に、再帰的な方法を使用して、出力ツリーの最大の高さを見つけます。

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バイトで、明らかなゴルフです。ただのファイ。
mbomb007

0

Python 2、231バイト

ここで試してみてください

私のプログラムでは現在、最後の2つの例が間違っています。誰かがそれを修正するのを手伝ってくれますか?ありがとう。

3次元の6つの可能な順列すべてをリストでソートし、リスト内で最も長い連続順序関係を確認してから、それらの最大値を見つけます。

また、もっとゴルフできるかどうかは知っていますが、これを使用できるかどうかはわかりませんでした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.