0526 - Preturi

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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

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