0561 - Rafaelo
Sursă: [1]
Enunț
Alina dispune de o sumă S de bani. Apropiindu-se ziua ei de naștere, vrea să cumpere cât mai multe cutii cu bomboane Rafaelo. Alina are la dispoziție N magazine din care poate face această alegere. Cunoscând prețul unei cutii de bomboane Rafaelo în fiecare magazin și faptul că va cumpăra toate cutiile cu bomboane din același magazin, ajutați-o pe Alina să facă această alegere astfel încât să nu depășească suma S de care dispune.
Cerință
Cunoscând suma S de bani, numărul N de magazine și p1, p2, p3,… , pN prețul unei cutii de bomboane Rafaelo în fiecare magazin, stabiliți numărul maxim de cutii de bomboane ce poate fi cumpărat și magazinul din care pot fi cumpărate. Dacă sunt mai multe astfel de magazine se va afișa primul dintre ele în ordinea în care au fost date.
Date de intrare
Programul citește de la tastatură separate prin spații suma S, N numărul de magazine și apoi N numere naturale nenule separate prin spații, reprezentând prețul unei cutii cu bomboane Rafaelo în fiecare magazin.
Date de ieșire
Programul afișează pe ecran două numere naturale x și y, separate prin exact un spațiu, reprezentând numărul maxim de cutii cu bomboane Rafaelo ce pot fi cumpărate, respectiv magazinul din care pot fi cumpărate.
Restricții și precizări
- 1 ≤ N ≤ 100
- 1 ≤ S ≤ 10000
- Prețul unei cutii cu bomboane este un număr natural nenul mai mic sau egal cu 1000.
- Cel puțin un magazin are prețul unei cutii cu bomboane mai mic sau egal cu S.
Exemplu
- Intrare
- 20 5
- 9 3 4 8 3
- Ieșire
- 6 2
Rezolvare
<syntaxhighlight lang="python" line="1"> def citeste_n():
while True: try: n = int(input("Introduceti numarul de valori: ")) s = int(input("Introduceti suma de bani: ")) if 1<= n <= 100 and 1<= s <= 10000: print("Datele sunt corecte.") return n else: print("Numarul de valori trebuie sa fie intre 2 si 20.") except ValueError: print("Trebuie introduse doar numere intregi.")
def citeste_valori(n):
valori = [] for i in range(n): while True: try: valoare = int(input("Introduceti o valoare: ")) if valoare >= 1 and valoare <= 1000000000 : print("Datele sunt corecte.") valori.append(valoare) break else: print("Valoarea trebuie sa fie intre 1 si 1.000.000.000.") except ValueError: print("Trebuie introduse doar valori naturale.")
return valori
def rafaelo(s, valori):
max_cutii = 0 magazin = 0 for i in range(len(valori)): if s // valori[i] > max_cutii: max_cutii = s // valori[i] magazin = i + 1
print("Se pot cumpara maxim", max_cutii, "cutii de bomboane de la magazinul", magazin)
if _name_ == '_main_':
n = citeste_n() valori = citeste_valori(n) s = int(input("Introduceti suma de bani: ")) rafaelo(s, valori)
</syntaxhighlight>
Explicatie
Acest cod este o implementare a algoritmului de rezolvare a problemei "Rafaelo", care are ca scop determinarea numărului maxim de cutii de bomboane ce pot fi cumpărate cu o anumită sumă de bani, dintr-un set de prețuri de la mai multe magazine.
Funcția citeste_n() primește de la utilizator numărul de valori și suma de bani, verificând dacă valorile introduse respectă condițiile din enunțul problemei. În cazul în care valorile sunt corecte, funcția returnează numărul de valori introduse.
Funcția citeste_valori(n) primește numărul de valori și returnează o listă de valori introduse de utilizator. Această funcție verifică dacă valorile introduse sunt corecte și le adaugă în listă.
Funcția rafaelo(s, valori) primește suma de bani și lista de prețuri, iar apoi utilizează o buclă for pentru a verifica fiecare preț din listă. Dacă suma de bani împărțită la preț este mai mare decât numărul maxim de cutii până acum, se actualizează valoarea maximă și se memorează numărul magazinului de unde trebuie achiziționate cutiile de bomboane.
În cele din urmă, funcția afișează rezultatul obținut, adică numărul maxim de cutii de bomboane care pot fi cumpărate și magazinul de unde trebuie achiziționate cutiile de bomboane.