0526 - Preturi: 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ă 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 natu...
 
No edit summary
 
Line 13: Line 13:
* cantitățile necesare sunt numere naturale nenule mai mici sau egale cu '''1000'''
* 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
* prețurile produselor sunt numere naturale nenule mai mici sau egale cu '''1000''', sau '''-1''', cu semnificația de mai sus
== Exemplu ==
== Exemplu 1 ==
; Intrare
; Intrare
: 5
5
: 4 4 5 1 2
4 4 5 1 2
: 3
3
: 5 8 6 -1 6
5 8 6 -1 6
: -1 4 8  9 5
-1 4 8  9 5
: 6 6 8  3 9
6 6 8  3 9
; Ieșire
; Ieșire
: 79
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 ==
== 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'''.
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'''.
Line 28: Line 39:
== 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 = 0
cantitati = list(map(int, input().split()))
    for i in range(n):
m = int(input())
        available_prices = [prices[j][i] for j in range(m) if prices[j][i] != -1]
preturi = [list(map(int, input().split())) for _ in range(m)]
        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


# Inițializăm suma minimă cu 0
    print(min_sum(n, quantities, m, prices))
suma_minima = 0


# Parcurgem fiecare produs
for i in range(n):
    # Găsim prețul minim pentru produsul curent
    pret_minim = float('inf')
    for j in range(m):
        # Dacă produsul este disponibil în magazinul curent și prețul este mai mic decât prețul minim curent
        if preturi[j][i] != -1 and preturi[j][i] < pret_minim:
            pret_minim = preturi[j][i]
    # Adăugăm la suma minimă prețul minim al produsului curent înmulțit cu cantitatea necesară
    suma_minima += pret_minim * cantitati[i]


# Afișăm suma minimă
if __name__ == "__main__":
print(suma_minima)
    main()


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 16:01, 12 December 2023

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ă poate cumpăra orice produs din orice 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

Exemplu 1[edit | edit source]

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

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

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

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