0526 - Preturi
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ă poate cumpăra orice produs din orice 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
Exemplu 1
- Intrare
5 4 4 5 1 2 3 5 8 6 -1 6 -1 4 8 9 5 6 6 8 3 9
- Ieșire
Datele de intrare corespund restrictiilor impuse 79
Exemplu 2
- Intrare
101 4 4 5 1 2 3 5 8 6 -1 6 -1 4 8 9 5 6 6 8 3 9
- Ieșire
Datele de intrare nu corespund restrictiilor impuse
Explicatie
Din magazinul 1 se cumpără produsele 1 3; din magazinul 2 se cumpără produsele 2 5, iar din magazinul 3 se cumpără produsul 4. În total se plătesc 4 * 5 + 4 * 4 + 5 * 6 + 1 * 3 + 2 * 5 = 79.
Rezolvare
<syntaxhighlight lang="python" line> def min_sum(n, quantities, m, prices):
total = 0 for i in range(n): available_prices = [prices[j][i] for j in range(m) if prices[j][i] != -1] if available_prices: total += min(available_prices) * quantities[i] return total
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
print(min_sum(n, quantities, m, prices))
if __name__ == "__main__":
main()
</syntaxhighlight>