Tasks & Deadlines
Explicación
Nótese que la meta es procesar las tareas más cortas antes que las más largas.
Para cierta intuición al respecto, pensemos en dos tareas que tardan y unidades de tiempo. Nótese que, sean cuales sean los plazos, siempre es óptimo completar primero la tarea más corta.
Para demostrarlo de forma más concreta, tomemos tareas, con duraciones y plazos . Digamos que las completamos en un orden tal que es el número de la -ésima tarea completada, de modo que es una permutación de a .
La recompensa final es entonces
Reordenando la fórmula, obtenemos
¡Intenta expandirlas para ver por qué estas dos son iguales!
De esto se ve que debemos minimizar los valores más pequeños de , lo que equivale a procesar primero las tareas más cortas.
Implementación
Complejidad temporal:
#include <algorithm>
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
int main() {
int task_num;
std::cin >> task_num;
std::vector<std::pair<int, int>> tasks(task_num);
for (auto &[duration, deadline] : tasks) { std::cin >> duration >> deadline; }
std::sort(tasks.begin(), tasks.end());
long long time = 0;
long long reward = 0;
for (const auto &[duration, deadline] : tasks) {
time += duration;
reward += deadline - time;
}
cout << reward << endl;
}import java.io.*;
import java.util.*;
public class TasksNDeadlines {
public static void main(String[] args) throws IOException {
BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
int taskNum = Integer.parseInt(read.readLine());
int[][] tasks = new int[taskNum][];
for (int t = 0; t < taskNum; t++) {
StringTokenizer task = new StringTokenizer(read.readLine());
tasks[t] = new int[] {
Integer.parseInt(task.nextToken()), // duration
Integer.parseInt(task.nextToken()) // deadline
};
}
Arrays.sort(tasks, Comparator.comparingInt(t -> t[0]));
long time = 0;
long reward = 0;
for (int[] t : tasks) {
time += t[0];
reward += t[1] - time;
}
System.out.println(reward);
}
}tasks = []
for _ in range(int(input())):
duration, deadline = [int(i) for i in input().split()]
tasks.append((duration, deadline))
tasks.sort()
time = 0
reward = 0
for duration, deadline in tasks:
time += duration
reward += deadline - time
print(reward)