Watching Mooloo
Análisis oficial (C++, Java, Python)
Explicación
Resolvemos este problema con un algoritmo voraz.
Primero recorremos todos los días. El primer día, Bessie siempre tendrá que comprar una suscripción nueva. Sin embargo, en los días posteriores hay dos casos:
- Es mejor extender la última suscripción. Esto ocurre cuando el costo de extender la última suscripción, calculado restando la fecha de la última al día actual, es menor que .
- Si no se cumple la condición anterior, es mejor empezar una suscripción nueva por completo.
Implementación
Complejidad temporal:
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
int k;
cin >> n >> k;
vector<long long> days(n);
for (long long &d : days) { cin >> d; }
long long last_day = days[0];
long long cost = k + 1; // Empezar la primera suscripción
for (long long d : days) {
// ¿Debería Bessie extender la suscripción más reciente?
if (d - last_day < k + 1) {
cost += d - last_day;
} else {
// ¿O empezar una nueva por completo?
cost += k + 1;
}
// Guardar la fecha de la última suscripción
last_day = d;
}
cout << cost << endl;
}import java.io.*;
import java.util.*;
public class WatchingMooloo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int n = Integer.parseInt(input[0]);
int k = Integer.parseInt(input[1]);
long[] days = new long[n];
String[] daysInput = br.readLine().split(" ");
br.close();
for (int i = 0; i < n; i++) { days[i] = Long.parseLong(daysInput[i]); }
long lastDay = days[0];
long cost = k + 1; // Empezar la primera suscripción
for (long d : days) {
// ¿Debería Bessie extender la suscripción más reciente?
if (d - lastDay < k + 1) {
cost += d - lastDay;
} else {
// ¿O empezar una nueva por completo?
cost += k + 1;
}
// Guardar la fecha de la última suscripción
lastDay = d;
}
System.out.println(cost);
}
}n, k = map(int, input().split())
days = list(map(int, input().split()))
last_day = days[0]
cost = k + 1 # Empezar la primera suscripción
for d in days:
# ¿Debería Bessie extender la suscripción más reciente?
if d - last_day < k + 1:
cost += d - last_day
else:
# ¿O empezar una nueva por completo?
cost += k + 1
# Guardar la fecha de la última suscripción
last_day = d
print(cost)