Puoi leggere e provare a risolvere questo problema visitando questo indirizzo: territoriali.olinfo.it
Mettendo da parte i gusti strampalati di Mojito (come il fatto che stranamente tutti i filmati e tutte le canzoni in cui è interessato occupano la stessa quantità di spazio su disco) il succo del problema è questo: ci vengono dati tre numeri interi positivi, e noi vogliamo produrre due numeri interi (positivi, o eventualmente anche zero). Una volta letto e compreso il testo del problema, possiamo facilmente convincerci del fatto che la soluzione sia calcolabile partendo dal budget di byte "B" a disposizione (il primo dei 3 numeri positivi in input) e sottraendogli ripetutamente il valore in byte "F" dei filmati. Una volta che il budget "B" si è azzerato (o è diventato minore di F) cominciamo a fare la stessa cosa con la dimensione in byte "C" delle canzoni. Una soluzione che risolve il problema è la seguente:
#include <iostream>
using namespace std;
int main() {
int T;
cin >> T;
for (int caso = 1; caso <= T; caso++) {
int B, F, C;
cin >> B >> F >> C;
int filmati = 0, canzoni = 0;
for (; B >= F; filmati++) B -= F;
for (; B >= C; canzoni++) B -= C;
cout << "Case #" << caso << ": " << filmati << " " << canzoni << endl;
}
}
Questa soluzione è più che sufficiente a ottenere tutti i punti ma, se i limiti fossero più elevati, sarebbe necessario trovare una soluzione più efficiente (ad esempio, prova a cambiare int
in long long
e ad eseguire questo input: 1000000000000000000 7 5
). Esiste infatti una soluzione molto efficiente che non fa uso di cicli for interni (oltre a quello "obbligatorio" esterno per gestire i casi di input).
Indizio per trovarla: fai uso degli operatori di quoziente e resto 😉