Volver a los desafíos
Difícil 0 resueltos 0% de aceptación

Recompensas Máximas de Proyectos

Elige proyectos no superpuestos para obtener la mayor recompensa total.

Lo que aprenderás

  • Ordenar intervalos por hora de fin
  • Encontrar el último proyecto compatible con búsqueda binaria
  • Elegir entre tomar o saltar un proyecto

Problema

Ver original (inglés)

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

Ejemplo 1
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.

Ejemplo 2
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.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.