Puoi leggere e provare a risolvere questo problema visitando questo indirizzo: territoriali.olinfo.it
Prova a disegnare su un foglio di carta l'asse delle ascisse di un piano cartesiano. In parole povere è una semplice linea orizzontale in cui:
Una volta disegnato ciò, metti la penna sul punto 0 e comincia a scansionare l'array di numeri che ti vengono dati in input: quando incontri un +1 muoviti verso destra, e analogamente muoviti verso sinistra quando incontri un -1.
Per esempio con il primo input fornito dal testo, -1 -1 -1
, raggiungerai il punto -3 dell'asse, e la risposta per quell'input è 3. Con l'ultimo input, -1 +1 +1 +1 -1 +1 +1 +1 -1 +1
, raggiungerai invece il punto 4... ma la risposta per quell'input è 5 🤔
Guardando l'asse disegnato sul foglio puoi osservare che per quel caso di input la superficie totale percorsa dalla penna è proprio uguale a 5. Con un po' di ragionamento possiamo convincerci che la risposta alla domanda del problema (ovvero: quanti studenti diversi al minimo sono stati nella stanza) è equivalente a calcolare tale superficie, o più semplicemente: la differenza tra il "massimo punto" ed il "minimo punto" raggiunti dalla penna.
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int T;
cin >> T;
for (int t = 1; t <= T; t++) {
int minimo = 0, massimo = 0, somma = 0, N;
cin >> N;
for (int i = 0; i < N; i++) {
int x;
cin >> x;
somma += x;
minimo = min(minimo, somma);
massimo = max(massimo, somma);
}
cout << "Case #" << t << ": " << massimo - minimo << endl;
}
}