0527 - Preturi1
De la Universitas MediaWiki
Cerinţa
Gigel trebuie să cumpere n produse, pentru fiecare produs cunoscându-se cantitate necesară. În oraș sunt m magazine, în fiecare magazin găsindu-se produsele dorite la anumite prețuri. Determinați suma totală minimă necesară pentru a cumpăra produsele dorite, știind că Gigel trebuie să cumpere toate produsele din același magazin.
Date de intrare
Programul citește de la tastatură, în ordine:
- numărul de produse n
- n numere naturale, reprezentând cantitățile necesare din fiecare produs
- numărul de magazine m
- m șiruri de câte n numere, șirul i conținând în ordine prețurile celor n produse la magazinul i. Dacă la un magazin nu există un anumit produs, valoarea prețului va fi -1
Date de ieșire
Programul va afișa pe ecran numărul S, reprezentând suma minimă determinată.
Restricţii şi precizări
- 1 ⩽ n , m ⩽ 100
- cantitățile necesare sunt numere naturale nenule mai mici sau egale cu 1000
- prețurile produselor sunt numere naturale nenule mai mici sau egale cu 1000, sau -1, cu semnificația de mai sus
- trebuie cumpărate toate produsele, din același magazin
Exemplu 1
- Intrare
5 4 4 5 1 2 3 5 8 6 2 6 -1 4 1 1 5 6 6 8 3 9
- Ieșire
Datele de intrare corespund restrictiilor impuse 96
Exemplu 2
- Intrare
101 4 4 5 1 2 3 5 8 6 2 6 -1 4 1 1 5 6 6 8 3 9
- Ieșire
Datele de intrare nu corespund restrictiilor impuse
Explicatie
La magazinul 1 produsele costă 96, la magazinul 3 produsele costă 109, iar din magazinul 2 nu se poate cumpăra produsul 1.
Rezolvare
def min_sum(n, quantities, m, prices):
total_min = float('inf')
for i in range(m):
if all(p != -1 for p in prices[i]):
total = sum(prices[i][j] * quantities[j] for j in range(n))
total_min = min(total_min, total)
return total_min
def validare(n, m, quantities, prices):
if not 1 <= n <= 100 or not 1 <= m <= 100:
return False, "Datele de intrare nu corespund restrictiilor impuse"
for q in quantities:
if not 1 <= q <= 1000:
return False, "Datele de intrare nu corespund restrictiilor impuse"
for row in prices:
for p in row:
if not (-1 <= p <= 1000):
return False, "Datele de intrare nu corespund restrictiilor impuse"
return True, "Datele de intrare corespund restrictiilor impuse"
def main():
print("Introduceți numărul de produse:")
n = int(input())
print("Introduceți cantitățile necesare pentru fiecare produs:")
quantities = list(map(int, input().split()))
print("Introduceți numărul de magazine:")
m = int(input())
print("Introduceți prețurile pentru fiecare produs în fiecare magazin:")
prices = [list(map(int, input().split())) for _ in range(m)]
valid, message = validare(n, m, quantities, prices)
print(message)
if not valid:
return
total_min = min_sum(n, quantities, m, prices)
if total_min == float('inf'):
print("Nu este posibilă cumpărarea tuturor produselor.")
else:
print(total_min)
if __name__ == "__main__":
main()