0527 - Preturi1: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == 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''' * '...
 
No edit summary
 
Line 15: Line 15:
* prețurile produselor sunt numere naturale nenule mai mici sau egale cu '''1000''', sau '''-1''', cu semnificația de mai sus
* 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
* trebuie cumpărate toate produsele, din același magazin
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: 5
5
: 4 4 5 1 2
4 4 5 1 2
: 3
3
: 5 8 6 2 6
5 8 6 2 6
: -1 4 1 1 5
-1 4 1 1 5
: 6 6 8 3 9
6 6 8 3 9
; Ieșire
; Ieșire
: 96
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 ==
== Explicatie ==
La magazinul '''1''' produsele costă '''96''', la magazinul '''3''' produsele costă '''109''', iar din magazinul '''2''' nu se poate cumpăra produsul '''1'''.
La magazinul '''1''' produsele costă '''96''', la magazinul '''3''' produsele costă '''109''', iar din magazinul '''2''' nu se poate cumpăra produsul '''1'''.
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
# Citirea datelor de intrare
def min_sum(n, quantities, m, prices):
n = int(input())
    total_min = float('inf')
cantitati = list(map(int, input().split()))
    for i in range(m):
m = int(input())
        if all(p != -1 for p in prices[i]):
preturi = [list(map(int, input().split())) for _ in range(m)]
            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


# Inițializăm suma minimă cu infinit
    total_min = min_sum(n, quantities, m, prices)
suma_minima = float('inf')
    if total_min == float('inf'):
        print("Nu este posibilă cumpărarea tuturor produselor.")
    else:
        print(total_min)


# Parcurgem fiecare magazin
for i in range(m):
    # Calculăm suma totală a produselor din magazinul curent
    suma_curenta = 0
    for j in range(n):
        # Dacă produsul nu este disponibil în magazinul curent, trecem la următorul magazin
        if preturi[i][j] == -1:
            suma_curenta = float('inf')
            break
        # Adăugăm la suma curentă prețul produsului înmulțit cu cantitatea necesară
        suma_curenta += preturi[i][j] * cantitati[j]
    # Actualizăm suma minimă
    suma_minima = min(suma_minima, suma_curenta)


# Verificăm dacă a fost posibilă cumpărarea tuturor produselor
if __name__ == "__main__":
if suma_minima == float('inf'):
     main()
    print("Nu este posibilă cumpărarea tuturor produselor.")
else:
     # Afișăm suma minimă
    print(suma_minima)


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:19, 12 December 2023

Cerinţa[edit]

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]

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]

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

Restricţii şi precizări[edit]

  • 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]

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]

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]

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]

<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>