Alice, eine Studentin, hat in den nächsten Wochen eine Menge Hausaufgaben. Jede Hausaufgabe dauert genau einen Tag. Jeder Punkt hat auch eine Frist und einen negativen Einfluss auf ihre Noten (eine reelle Zahl voraussetzen, Bonuspunkte nur für die Annahme der Vergleichbarkeit), wenn sie die Frist nicht einhält.
Schreiben Sie eine Funktion, die anhand einer Liste von (Stichtag, Notenauswirkung) Zeitplänen festlegt, welche Hausaufgaben an welchem Tag zu erledigen sind, um die Summe der negativen Auswirkungen auf ihre Noten zu minimieren.
Alle Hausaufgaben müssen irgendwann erledigt werden, aber wenn sie eine Frist für einen Gegenstand versäumt, ist es egal, wie spät sie ihn abgibt.
In einer alternativen Formulierung:
Die ACME will die Kunden mit Wasser versorgen. Sie wohnen alle an einer Straße bergauf. ACME verfügt über mehrere Brunnen, die entlang der Straße verteilt sind. Jeder Brunnen hat genug Wasser für einen Kunden. Kunden bieten unterschiedliche Geldbeträge zur Lieferung an. Das Wasser fließt nur bergab. Maximieren Sie den Umsatz, indem Sie auswählen, welche Kunden beliefert werden sollen.
Wir können die Fristen nach Eimersortierung sortieren (oder einfach davon ausgehen, dass wir bereits nach Fristen sortiert haben).
Wir können das Problem leicht mit einem gierigen Algorithmus lösen, wenn wir zuerst nach absteigender Note sortieren. Diese Lösung ist nicht besser als O (n log n).
Inspiriert vom Median of Medians und randomisierten linearen Minimum-Spanning-Tree- Algorithmen vermute ich, dass wir mein einfaches Scheduling / Flow-Problem auch in (randomisierter?) Linearer Zeit lösen können.
Ich suche nach:
- ein (potentiell randomisierter) linearer Zeitalgorithmus
- oder alternativ ein Argument, dass lineare Zeit nicht möglich ist
Als Sprungbrett:
- Ich habe bereits bewiesen, dass es ausreicht, nur zu wissen, welche Aufgaben vor Ablauf der Frist erledigt werden können, um den gesamten Zeitplan in linearer Zeit zu rekonstruieren. (Diese Einsicht liegt der zweiten Formulierung zugrunde, bei der ich nur nach dem Zertifikat frage.)
- Ein einfaches (integrales!) Lineares Programm kann dieses Problem modellieren.
- Unter Verwendung der Dualität dieses Programms kann man einen Lösungsvorschlag in linearer Zeit auf seine Optimalität überprüfen, wenn man auch die Lösung für das Dualprogramm erhält. (Beide Lösungen können in einer linearen Anzahl von Bits dargestellt werden.)
Im Idealfall möchte ich dieses Problem in einem Modell lösen, bei dem nur der Vergleich zwischen Gradeinschlägen verwendet wird und dort keine Zahlen angenommen werden.
Ich habe zwei Ansätze, um dieses Problem zu lösen: einen, der auf Treaps unter Verwendung von Deadline und Impact basiert, und einen QuickSelect-ähnlichen, der auf der Auswahl zufälliger Pivot-Elemente und der Aufteilung der Elemente nach Impact basiert. Beide haben schlechteste Fälle, die O (n log n) oder schlechtere Leistung erzwingen, aber ich war nicht in der Lage, einen einfachen Sonderfall zu konstruieren, der die Leistung beider verringert.