7. KUVAR — REŠENJE
Tekst zadatka
NAPOMENA: Zadatak sa 1. kruga kvalifikacija, sezona 2022/2023. Preuzeto sa dms.rs/informatika-osnovne-skole/
Zadatak za 8. razred.
Potrebno predznanje: Podaci u C++, Operatori u C++
Kuvaru je za jednu porciju potrebno za glavno jelo
(pored ostalih sastojaka) m grama mesa, a za salatu
ili k grama kupusa ili c grama
cvekle.
Na raspolaganju je M grama mesa, K grama
kupusa i C grama cvekle, a svih ostalih sastojaka ima
mnogo više.
Napisati program koji učitava potrebne količine za jednu porciju
m, k, c, a zatim i raspoložive
količine M, K, C, i ispisuje
za koliko celih porcija (glavno jelo i salata) kuvar ima dovoljno
sastojaka.
Ulaz
Na standardnom ulazu su redom brojevi
m, k, c, M,
K, C, svaki u posebnom redu.
Svi brojevi su celi, pozitivni i manji od 50000.
Izlaz
Na standardni izlaz ispisati samo jedan ceo neoznačen broj, a to je broj celih porcija koje mogu da se pripreme.
Primer 1
Ulaz
200
250
150
2200
1400
890
Izlaz
10
Primer 2
Ulaz
150
200
100
6100
5100
1000
Izlaz
35
Objašnjenje rešenja
Za jednu kompletnu porciju potrebno je pripremiti glavno jelo i salatu.
Najpre možemo izračunati koliko glavnih jela kuvar može da pripremi od raspoložive količine mesa:
M / m
Pošto se traži broj celih porcija, koristi se celobrojno deljenje. Na primer, ako imamo 2200 grama mesa, a za jednu porciju je potrebno 200 grama, možemo pripremiti 11 celih glavnih jela.
Zatim računamo koliko salata možemo pripremiti od kupusa i koliko od cvekle.
K / k
C / c
Važan detalj je to što za jednu salatu koristimo ili kupus ili cveklu. To znači da kuvar može neke salate napraviti od kupusa, a neke od cvekle. Zato se ova dva broja sabiraju.
K / k + C / c
Na kraju, broj kompletnih porcija određuje manji od broja mogućih glavnih jela i broja mogućih salata.
min(M / m, K / k + C / c)
Funkcija min() vraća manju od dve vrednosti.
Upravo ta manja vrednost predstavlja maksimalan broj kompletnih
porcija koje kuvar može da pripremi.
Ideja algoritma
- Učitati potrebne količine za jednu porciju:
m,kic. - Učitati raspoložive količine:
M,KiC. - Izračunati koliko glavnih jela može da se pripremi:
Pm = M / m. - Izračunati koliko salata može da se pripremi od kupusa:
Pk = K / k. - Izračunati koliko salata može da se pripremi od cvekle:
Pc = C / c. - Izračunati ukupan broj salata kao
Ps = Pk + Pc. - Uzeti minimum između broja glavnih jela i ukupnog broja salata.
- Ispisati dobijeni broj.
Ključna ideja je da su za jednu kompletnu porciju potrebni i glavno jelo i salata. Zato ne možemo pripremiti više kompletnih porcija nego što možemo pripremiti jednog od ta dva dela obroka.
Kompletno C++ rešenje
// ZADATAK 7. KUVAR - REŠENJE
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int m, k, c, M, K, C;
// m - količina mesa potrebna za jednu porciju
// k - količina kupusa potrebna za jednu salatu
// c - količina cvekle potrebna za jednu salatu
//
// M - raspoloživa količina mesa
// K - raspoloživa količina kupusa
// C - raspoloživa količina cvekle
// Učitavanje podataka.
cin >> m >> k >> c >> M >> K >> C;
// Broj glavnih jela koja možemo pripremiti
// na osnovu raspoložive količine mesa.
int Pm = M / m;
// Broj salata koje možemo pripremiti od kupusa.
int Pk = K / k;
// Broj salata koje možemo pripremiti od cvekle.
int Pc = C / c;
// Za svaku salatu možemo koristiti ili kupus ili cveklu.
// Zato se ukupan broj mogućih salata dobija sabiranjem.
int Ps = Pk + Pc;
// Za kompletnu porciju potrebno je imati
// i glavno jelo i salatu.
// Zato uzimamo manju od ove dve vrednosti.
int brojPorcija = min(Pm, Ps);
// Ispis konačnog rezultata.
cout << brojPorcija << endl;
return 0;
}
Objašnjenje koda
1. Zaglavlja programa
Zaglavlje <iostream> omogućava rad sa standardnim
ulazom i izlazom, odnosno korišćenje naredbi cin i
cout.
Zaglavlje <algorithm> potrebno je zbog funkcije
min(), koja se koristi na kraju programa.
2. Učitavanje podataka
Naredba
cin >> m >> k >> c >> M >> K >> C;
učitava svih šest vrednosti.
Prve tri vrednosti predstavljaju potrebne količine sastojaka za jednu porciju, a druge tri predstavljaju količine koje su kuvaru na raspolaganju.
3. Izračunavanje broja glavnih jela
Broj glavnih jela određujemo celobrojnim deljenjem raspoložive količine
mesa sa količinom potrebnom za jedno jelo:
int Pm = M / m;
Na primer, ako je M = 2200, a m = 200,
dobijamo:
2200 / 200 = 11
Dakle, imamo dovoljno mesa za 11 glavnih jela.
4. Izračunavanje salata od kupusa
Ako je za jednu salatu potrebno k grama kupusa, a imamo
K grama, broj salata od kupusa je:
int Pk = K / k;
5. Izračunavanje salata od cvekle
Na isti način računamo koliko salata možemo napraviti od cvekle:
int Pc = C / c;
6. Ukupan broj salata
Pošto jednu salatu možemo napraviti ili od kupusa ili od cvekle,
možemo iskoristiti oba raspoloživa resursa.
Zato ukupan broj salata računamo:
int Ps = Pk + Pc;
Na primer, ako možemo napraviti 5 salata od kupusa i 5 salata od cvekle, ukupno možemo napraviti 10 salata.
7. Konačan broj kompletnih porcija
Za jednu kompletnu porciju potrebni su i glavno jelo i salata.
Zato konačan rezultat ne može biti veći od bilo kog od ta dva broja.
Koristimo funkciju min():
int brojPorcija = min(Pm, Ps);
Ako imamo sastojke za 11 glavnih jela i 10 salata, možemo pripremiti samo 10 kompletnih porcija.
Praćenje algoritma na primeru 1
Potrebno je:
m = 200
k = 250
c = 150
Na raspolaganju imamo:
M = 2200
K = 1400
C = 890
Broj glavnih jela:
Pm = 2200 / 200 = 11
Broj salata od kupusa:
Pk = 1400 / 250 = 5
Broj salata od cvekle:
Pc = 890 / 150 = 5
Ukupan broj salata:
Ps = 5 + 5 = 10
Konačan broj kompletnih porcija:
min(11, 10) = 10
Zato je rezultat:
10
Praćenje algoritma na primeru 2
Potrebno je:
m = 150
k = 200
c = 100
Na raspolaganju imamo:
M = 6100
K = 5100
C = 1000
Broj glavnih jela:
Pm = 6100 / 150 = 40
Broj salata od kupusa:
Pk = 5100 / 200 = 25
Broj salata od cvekle:
Pc = 1000 / 100 = 10
Ukupan broj salata:
Ps = 25 + 10 = 35
Konačan broj kompletnih porcija:
min(40, 35) = 35
Zato je rezultat:
35
Zašto se ne koristi max()?
Jedna od mogućih grešaka u ovom zadatku jeste korišćenje funkcije
max() za izbor između broja salata od kupusa i broja
salata od cvekle.
Na primer, ako imamo mogućnost da napravimo 7 salata od kupusa i 4 salate od cvekle, nije tačno da možemo napraviti samo 7 salata. Možemo napraviti:
7 + 4 = 11
Zato je ispravno:
Ps = Pk + Pc;
Funkcija min() koristi se tek na kraju, kada upoređujemo
broj glavnih jela sa ukupnim brojem salata.
Česte greške
1. Korišćenje max() umesto sabiranja
Pogrešno:
int Ps = max(Pk, Pc);
Ispravno:
int Ps = Pk + Pc;
2. Zaboravljanje funkcije min()
Nije dovoljno izračunati samo broj glavnih jela ili samo broj salata.
Potrebno je imati oba dela kompletnog obroka.
Zato se na kraju koristi:
min(Pm, Ps)
3. Korišćenje realnog deljenja
Zadatak traži broj celih porcija, pa je potrebno celobrojno
deljenje.
Na primer:
890 / 150 = 5
Ostatak od 140 grama nije dovoljan za još jednu celu salatu i zato se ne računa.
4. Izostavljanje zaglavlja <algorithm>
Funkcija min() pripada standardnoj biblioteci algoritama,
pa je pravilno navesti:
#include <algorithm>
Vremenska i memorijska složenost
Program izvršava samo nekoliko aritmetičkih operacija, bez obzira na veličinu ulaznih brojeva.
Zato je vremenska složenost:
O(1).
Program koristi samo nekoliko celobrojnih promenljivih, pa je i
memorijska složenost:
O(1).
Sažetak rešenja
Za rešavanje zadatka potrebno je izračunati tri osnovne stvari: koliko glavnih jela možemo napraviti, koliko salata možemo napraviti od kupusa i koliko od cvekle.
Pošto jednu salatu možemo napraviti ili od kupusa ili od cvekle, ukupan broj salata predstavlja zbir:
K / k + C / c
Kompletna porcija zahteva i glavno jelo i salatu, pa je konačan odgovor minimum između ta dva broja:
min(M / m, K / k + C / c)
To je cela suština zadatka.
Povratak
|<
Kvalifikacije za okružna takmičenja
