Pongo acá los recursos relacionados a la charla “Cómo resolver los problemas con vector y for”.
Los problemas que vimos son:
Pongo acá los recursos relacionados a la charla “Cómo resolver los problemas con vector y for”.
Los problemas que vimos son:
Código del problema 1) explicado mediante comentarios
#include <vector>
#include <iostream>
using namespace std;
int CLASE = 0;
int FERIADO = 1;
int main() {
int n, d, f;
cin >> n >> d >> f;
// Inicialmente en mi calendario todos los dias tienen clase
// Tiene tamano d+1 para usarlo con dias de 1 a d
// vector empieza desde 0, esa posicion no la usamos
vector <int> calendario (d+1, CLASE);
for (int i =0; i < n ; i++) {
int feriado;
cin >> feriado;
// Marco un dia como feriado
calendario[feriado] = FERIADO;
}
int max_dias = 0;
// Probamos que pasaria si empieza con el auto en el dia i (pruebo todo)
for (int i = 1; i <= d; i++) {
// j va a ser el final de los dias que falta
int j = i;
int faltas_actuales = 0;
while (j <= d and (faltas_actuales < f or calendario[j] == FERIADO )) {
// Mientras no haya pasado el ultimo dia y ..
// ... y tenga faltas o sea feriado
if (calendario[j] == FERIADO) {
// Si avanzar no me hace faltar a clase, avanzo
j++;
} else {
// Si es un dia de clase
if (faltas_actuales < f) {
// Si todavia tengo faltas para usar
faltas_actuales++;
j++;
} else {
// Este else esta al pedo
// Solo para comentar que si entra a este else, va a salir del while
// Se podria poner un break :P
}
}
}
max_dias = max(max_dias, j - i);
// Notar que si faltamos desde el dia 1 hasta el 2
// i = 1 y j = 3
// j siempre queda en un dia mas de lo que faltamos
// Tecnicamente, usamos la notacion cerrado-abierto de intervalos [i,j)
// https://es.wikipedia.org/wiki/Intervalo_(matem%C3%A1tica)
// De esta forma podemos calcular la cantidad de dias entre i y j como j - i
// Si no, tendriamos que sumar o restar uno
}
cout << max_dias << endl;
}