Charla: Cómo resolver los problemas con vector y for

Pongo acá los recursos relacionados a la charla “Cómo resolver los problemas con vector y for”.

Los problemas que vimos son:

  1. http://juez.oia.unsam.edu.ar/#/task/feriados/statement
  2. http://www.spoj.com/problems/TAP2012B/
4 Me gusta

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;
}