Problema
Cada proyecto se representa como [start_day, end_day, reward]. Ocupa todos los días desde start_day hasta end_day, incluyendo ambos extremos. Solo puedes participar en un proyecto por día. Elige un subconjunto con la mayor recompensa total. Un proyecto que comienza el mismo día que termina otro entra en conflicto con él.
Implementa project_rewards(projects).
Entrada
projects: Filas de tres enteros: día de inicio, día de fin y recompensa.
Salida
Devuelve la recompensa total máxima; no es necesario devolver los proyectos elegidos.
Restricciones
1 ≤ projects ≤ 200,000. 1 ≤ start_day ≤ end_day ≤ 1,000,000,000. Las recompensas son enteros positivos de como máximo 1,000,000,000.
Ejemplos
Entrada:
projects = [
[1, 2, 4],
[3, 4, 5],
[2, 3, 10]
]
Salida esperada:
expected = 10
Entrada:
std::vector<std::vector<long long>> projects = {
{1, 2, 4},
{3, 4, 5},
{2, 3, 10}
};
Salida esperada:
long long expected = 10;
Entrada:
long[][] projects = new long[][] {
new long[] {1, 2, 4},
new long[] {3, 4, 5},
new long[] {2, 3, 10}
};
Salida esperada:
long expected = 10;
Explicación
Los dos primeros proyectos suman 9 juntos. El último da 10 y entra en conflicto con ambos, así que se elige solo a él.
Entrada:
projects = [
[1, 2, 4],
[2, 3, 5]
]
Salida esperada:
expected = 5
Entrada:
std::vector<std::vector<long long>> projects = {
{1, 2, 4},
{2, 3, 5}
};
Salida esperada:
long long expected = 5;
Entrada:
long[][] projects = new long[][] {
new long[] {1, 2, 4},
new long[] {2, 3, 5}
};
Salida esperada:
long expected = 5;
Explicación
Ambos ocupan el día 2. Solo se elige el segundo, con recompensa 5.
Cómo abordarlo
Inténtalo primero por tu cuenta y luego abre las pistas una a una.
Pista 1
Este es un problema de weighted interval scheduling con intervalos de tiempo que se solapan.
Pista 2
Ordena los proyectos por día de fin y combina cada proyecto con el último compatible anterior.
Pista 3
Sé preciso con los conflictos: otro proyecto que empieza en un día de fin también se solapa.
Complejidad esperada
tiempo O(n log n), espacio extra O(n)
Referencias
Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.