Wenn Sie Bücher stapeln, möchten Sie normalerweise die größten unten und die kleinsten oben platzieren. Bei meiner latenten Zwangsstörung fühle ich mich jedoch sehr unwohl, wenn ich zwei Bücher habe, von denen eines kürzer (in der Höhe), aber breiter als das andere ist. Egal in welcher Reihenfolge ich sie einlege, das obere Buch wird auf einer Seite über das untere Buch hinausragen.
Angenommen, ein Buch hat Dimensionen (10,15)
und ein anderes hat Dimensionen (11,14)
. Egal in welche Richtung ich sie lege, ich bekomme einen Überhang. Wenn ich aber Bücher mit den Maßen (4,3)
und habe (5,6)
, kann ich ein Überhängen vermeiden, indem ich das letztere unter das erstere lege.
Für die Zwecke dieser Herausforderung werden Überhänge nur in Bezug auf das Buch direkt unten betrachtet . Zum Beispiel , wenn ich einen Stapel haben (5,5)
, (3,3)
, (4,4)
(nicht , dass jeder vernünftige Mensch würde das tun), die Top-Buch zählt als Überhang, obwohl es über den Boden Buch erstreckt sich nicht. In ähnlicher Weise der Stapel (3,3)
, (3,3)
, (4,4)
hat auch nur einen Überhang, trotz des oben Buch über den Boden eines erstreckt.
Die Herausforderung
Sortieren Sie die Paare / Bücher anhand einer Liste von ganzzahligen Paaren für die Buchdimensionen so, dass die Anzahl der Überhänge minimal ist. Sie dürfen die Bücher nicht drehen - ich möchte, dass alle Buchrücken in die gleiche Richtung weisen. Wenn es mehrere Lösungen mit der gleichen Anzahl von Überhängen gibt, können Sie eine solche Reihenfolge wählen. Ihr Sortieralgorithmus muss nicht stabil sein. Bei Ihrer Implementierung wird möglicherweise davon ausgegangen, dass die Buchgröße jeweils weniger als 2 16 beträgt.
Zeitkomplexität: Um dies etwas interessanter zu gestalten, muss die asymptotische Worst-Case-Komplexität Ihres Algorithmus in Bezug auf die Größe des Stapels polynomisch sein. Sie können also nicht alle möglichen Permutationen testen. Bitte fügen Sie einen kurzen Beweis für die Optimalität und Komplexität Ihres Algorithmus und optional ein Diagramm bei, das die Skalierung für große Zufallseingaben zeigt. Natürlich können Sie die maximale Größe der Eingabe nicht als Argument verwenden, dass Ihr Code in O (1) ausgeführt wird.
Sie können ein Programm oder eine Funktion schreiben, Eingaben über STDIN, ARGV oder ein Funktionsargument in einem beliebigen (nicht vorverarbeiteten) Listenformat vornehmen und das Ergebnis entweder drucken oder zurückgeben.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
Ich bin zuversichtlich, dass es eine Polynomlösung gibt, aber wenn Sie mir das Gegenteil beweisen können, können Sie einen solchen Beweis anstelle einer Golf-Vorlage einreichen. In diesem Fall können Sie P ≠ NP annehmen . Ich werde den ersten korrekten solchen Beweis annehmen und ihm eine Prämie gewähren.
Beispiele
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]]
Ich habe diese von Hand erstellt. Lassen Sie mich wissen, wenn Sie Fehler entdecken.