Zurück zu den Herausforderungen
Schwierig 0 gelöst 0% Erfolgsquote

Maximale Projektbelohnungen

Wähle nicht überlappende Projekte aus, um die größtmögliche Gesamtbelohnung zu erhalten.

Das lernst du

  • Intervalle nach Endzeit sortieren
  • Das letzte kompatible Projekt binär suchen
  • Zwischen Nehmen und Auslassen eines Projekts wählen

Problem

Jedes Projekt ist ein Tupel [start_day, end_day, reward]. Es belegt jeden Tag von start_day bis end_day, einschließlich beider Grenzen. Du kannst an einem Tag nur an einem Projekt teilnehmen. Wähle eine Teilmenge mit der höchsten Gesamtbelohnung aus. Ein Projekt, das am Endtag eines anderen Projekts beginnt, steht mit diesem im Konflikt.

Implementiere project_rewards(projects).

Eingabe

projects: Zeilen mit jeweils drei Ganzzahlen: Starttag, Endtag und Belohnung.

Ausgabe

Gib die maximal mögliche Gesamtbelohnung zurück; die ausgewählten Projekte müssen nicht zurückgegeben werden.

Einschränkungen

1 ≤ projects ≤ 200.000. 1 ≤ start_day ≤ end_day ≤ 1.000.000.000. Belohnungen sind positive Ganzzahlen, höchstens 1.000.000.000.

Beispiele

Beispiel 1
Eingabe:
projects = [
    [1, 2, 4],
    [3, 4, 5],
    [2, 3, 10]
]

Erwartete Ausgabe:
expected = 10
Eingabe:
std::vector<std::vector<long long>> projects = {
    {1, 2, 4},
    {3, 4, 5},
    {2, 3, 10}
};

Erwartete Ausgabe:
long long expected = 10;
Eingabe:
long[][] projects = new long[][] {
    new long[] {1, 2, 4},
    new long[] {3, 4, 5},
    new long[] {2, 3, 10}
};

Erwartete Ausgabe:
long expected = 10;

Erläuterung

Die ersten beiden Projekte bringen zusammen 9 ein. Das letzte bringt 10 ein und steht mit beiden im Konflikt, daher wähle es alleine.

Beispiel 2
Eingabe:
projects = [
    [1, 2, 4],
    [2, 3, 5]
]

Erwartete Ausgabe:
expected = 5
Eingabe:
std::vector<std::vector<long long>> projects = {
    {1, 2, 4},
    {2, 3, 5}
};

Erwartete Ausgabe:
long long expected = 5;
Eingabe:
long[][] projects = new long[][] {
    new long[] {1, 2, 4},
    new long[] {2, 3, 5}
};

Erwartete Ausgabe:
long expected = 5;

Erläuterung

Beide belegen Tag 2. Wähle nur das zweite Projekt mit einer Belohnung von 5.

So gehst du vor

Versuch es zuerst allein und öffne dann einen Hinweis nach dem anderen.

Hinweis 1

Das ist ein Weighted-Interval-Scheduling-Problem mit überlappenden Zeitbereichen.

Hinweis 2

Sortiere Projekte nach ihrem Endtag und kombiniere jedes Projekt mit dem zuletzt kompatiblen früheren.

Hinweis 3

Sei genau bei Konflikten: Ein anderes Projekt, das an einem Endtag startet, überlappt noch.

Erwartete Komplexität

Zeit O(n log n), zusätzlicher Speicher O(n)

Referenzen

Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.

Von anderen lernen

Community-Lösungen

Noch keine veröffentlichten Lösungen. Löse die Aufgabe und teile als Erster eine Lösung.