0527 - Preturi1

From Bitnami MediaWiki

Cerinţa[edit | edit source]

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[edit | edit source]

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[edit | edit source]

Programul va afișa pe ecran numărul S, reprezentând suma minimă determinată.

Restricţii şi precizări[edit | edit source]

  • 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[edit | edit source]

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[edit | edit source]

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[edit | edit source]

La magazinul 1 produsele costă 96, la magazinul 3 produsele costă 109, iar din magazinul 2 nu se poate cumpăra produsul 1.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> 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()

</syntaxhighlight>