4301 - Gustare

De la Universitas MediaWiki

Cerinţa

A venit ora mesei pentru Por Costel (masa dintre prânz și cină). Scormonind printr-o grădină, el descoperă un număr de N coceni de porumb și M mere. Masa lui Por Costel va consta în exact un cocean și un măr. Însă, mai nou, fanii săi l-au atenționat că trebuie să aibă grijă ce mănâncă. Fiecare cocean și fiecare măr are o valoare nutritivă. Valoarea nutritivă a mesei va fi valoarea nutritivă a coceanului ales + valoarea nutritiva a mărului ales. Dându-se valorile nutritive ale cocenilor și ale merelor, Por Costel vă întreabă dacă există o masă pe care o poate lua cu valoare nutritivă X. Pentru că Por Costel vrea sa mănânce de mai multe ori între prânz și cină, el va vă pune T întrebări de forma aceasta. (Întrebările sunt independente între ele, a nu se considera că după o întrebare se elimină perechea cocean-mar aleasă).

Date de intrare

Pe prima linie a fișierului gustarein.txt se găsește un număr natural N: numărul de coceni. Pe a doua linie se găsește o secvență de N numere naturale separate prin câte un spațiu (valorile nutritive ale cocenilor). Pe a treia linie se găsește un număr natural M: numărul de mere. Pe a patra linie se găsește o secvență de M numere naturale separate prin câte un spațiu (valorile nutritive ale merelor). Pe a cincea linie se găsește un număr natural T, numărul de întrebări ale lui Por Costel. Pe a sasea linie se gasește o secvență de T numere naturale separate prin câte un spațiu, al i-lea număr fiind valoarea dorită pentru cea de a i-a masă.

Date de ieşire

În fișierul gustareout.txt se vor scrie T linii corespunzătoare celor T întrebări. A i-a linie va conține mesajul DA dacă se poate forma valoarea nutritivă pentru a i-a masă și NU în caz contrar.

Restricții și precizări

  • N, M ≤ 500.000
  • T ≤ 100
  • 0 ≤ valoare nutritiva a unui aliment ≤ 1.000.000.000
  • 0 ≤ valoarea X a unei intrebari ≤ 2.000.000.000
  • Pentru 20 de puncte, N, M ≤ 1000
  • Pentru alte 50 de puncte, T ≤ 20

Exemplul 1

gustarein.txt
4
2 2 3 5
3
2 4 6
5
6 20 10 11 7
gustareout.txt
Datele de intrare corespund restrictiilor impuse
DA
NU
NU
DA 
DA


Exemplul 2

gustarein.txt
jgjikfikm
gustareout.txt
Datele de intrare nu corespund restrictiilor impuse


Rezolvare

# Funcția de validare verifică dacă datele de intrare sunt în intervalul specificat
def validare(n_validare, m_validare, t_validare, coceni_validare, mere_validare, intrebari_validare):
    if n_validare < 1 or n_validare > 500000:
        raise ValueError
    if m_validare < 1 or m_validare > 500000:
        raise ValueError
    if t_validare < 1 or t_validare > 100:
        raise ValueError
    for valoare in coceni_validare + mere_validare:
        if valoare < 0 or valoare > 1000000000:
            raise ValueError
    for x in intrebari_validare:
        if x < 0 or x > 2000000000:
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse.\n")


# Funcția exista_masa verifică dacă există o masă cu valoare nutritivă X
def exista_masa(coceni, mere, intrebari):
    raspunsuri_creare = []
    for x in intrebari:
        exista = 'NU'
        for cocean in coceni:
            if x - cocean in mere:
                exista = 'DA'
                break
        raspunsuri_creare.append(exista)
    return raspunsuri_creare


if __name__ == '__main__':
    file_in = open("gustarein.txt", "r")
    file_out = open("gustareout.txt", "w")

    try:
        # Citim numărul de coceni, numărul de mere și numărul de întrebări
        n_main = int(file_in.readline())
        coceni_main = list(map(int, file_in.readline().split()))
        m_main = int(file_in.readline())
        mere_main = list(map(int, file_in.readline().split()))
        t_main = int(file_in.readline())
        intrebari_main = list(map(int, file_in.readline().split()))
        # Validăm datele de intrare
        validare(n_main, m_main, t_main, coceni_main, mere_main, intrebari_main)
        # Verificăm dacă există o masă cu valoare nutritivă X pentru fiecare întrebare
        raspunsuri = exista_masa(coceni_main, mere_main, intrebari_main)
        # Scriem răspunsurile în fișierul de ieșire
        for raspuns in raspunsuri:
            file_out.write(raspuns + '\n')

    # Dacă datele de intrare nu sunt valide, afișăm un mesaj de eroare
    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    # Dacă datele de intrare sunt incomplete, afișăm un mesaj de eroare
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")