本を積み重ねるときは、通常、一番大きいものを一番下に、一番小さいものを一番上に置きます。しかし、潜在的なOCDのおかげで、2冊の本があり、一方の本の高さは短く、他方の本よりも幅が広い場合、非常に不安になります。どの順序で配置しても、一番上の本は一番下の本を超えて一面に広がります。
例として、ある本には次元が(10,15)
あり、別の本には次元があるとしましょう(11,14)
。どのように配置しても、オーバーハングが発生します。ただし、寸法が(4,3)
、の書籍がある場合は(5,6)
、前者の下に後者を配置することで張り出しを回避できます。
この挑戦の目的のために、私たちはすぐ下の本に関してオーバーハングを考えるでしょう。例えば、私は、スタックを持っている場合は(5,5)
、(3,3)
、(4,4)
(まともな人はそれを行うだろうということではない)、オーバーハングなどのトップ帳の数は、それが下の本を超えて拡張しませんが。同様に、スタックは(3,3)
、(3,3)
、(4,4)
また、下の1を越えて延びるトップ帳にもかかわらず、唯一のオーバーハングを有します。
チャレンジ
ブックの寸法の整数ペアのリストが与えられたら、オーバーハングの数が最小になるようにそれらのペア/ブックをソートします。本を回転させてはいけません-すべてのスパインを同じ方向に向けてください。オーバーハングの数が同じソリューションが複数ある場合は、そのような順序を選択できます。ソートアルゴリズムは安定している必要はありません。実装では、ブックの寸法がそれぞれ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]]
これらは手作業で作成したので、間違いを見つけたら教えてください。