0071 - Reducere: Difference between revisions

From Bitnami MediaWiki
Flaviu (talk | contribs)
No edit summary
Flaviu (talk | contribs)
No edit summary
Line 15: Line 15:


== Date de ieșire ==  
== Date de ieșire ==  
Programul afișează pentru fiecare dintre cele T teste, pe câte o linie a ecranului valoare 1, dacă tabloul A se poate reduce la tabloul B, respectiv 0 în caz contrar.
Dacă datele sunt introduse corect, pe ecran se va afișa:
'''"Datele sunt introduse corect."''', apoi pe un rând nou '''numărul c''', reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: '''"Datele nu corespund restricțiilor impuse."'''.


== Restricţii şi precizări ==
== Restricţii şi precizări ==
Line 33: Line 34:
: 5 3 4
: 5 3 4
; Ieșire
; Ieșire
: Datele nu corespund restricțiilor impuse.
: 1
: 1
: 0
: 0
Line 42: Line 44:


def citeste_date_intrare():
def citeste_date_intrare():
    """Functia citeste datele de intrare si returneaza cele doua liste A si B."""
     n = int(input())
     n = int(input())
     a = [int(x) for x in input().split()]
     a = list(map(int, input().split()))
     m = int(input())
     m = int(input())
     b = [int(x) for x in input().split()]
     b = list(map(int, input().split()))
     return a, b
     return a, b


def verifica_reducere(a, b):
def valideaza_datele_intrare(a, b):
     """Verifica daca lista a se poate reduce la lista b."""
     if not(0 < len(a) < 1001 and 0 < len(b) < 1001):
     j = 0  # pozitia curenta in lista a
        return False
    for x in b:
     if not(all(1 <= x <= 10000 for x in a) and all(1 <= x <= 10000 for x in b)):
         s = 0  # suma elementelor consecutive din lista a
        return False
         while j < len(a) and s < x:
    return True
             s += a[j]
 
             j += 1
def se_poate_reduce(a, b):
         if s != x:
    i, j = 0, 0
    while i < len(a) and j < len(b):
         s = a[i]
        i += 1
         while i < len(a) and s < b[j]:
             s += a[i]
             i += 1
         if s != b[j]:
             return False
             return False
     return True
        j += 1
     return j == len(b)


if __name__ == '__main__':
if __name__ == '__main__':
     t = int(input()) # numarul de teste
     t = int(input())
     for i in range(t):
     for _ in range(t):
         a, b = citeste_date_intrare()
         a, b = citeste_date_intrare()
         if verifica_reducere(a, b):
         if valideaza_datele_intrare(a, b):
             print(1)
             if se_poate_reduce(a, b):
                print("Datele sunt introduse corect.")
                print(1)
            else:
                print("Datele sunt introduse corect.")
                print(0)
         else:
         else:
             print(0)
             print("Datele nu corespund restricțiilor impuse.")




Line 74: Line 88:
== Explicatie Rezolvare ==
== Explicatie Rezolvare ==


În funcția citeste_date_intrare citim numărul de elemente ale fiecărei liste, apoi citim elementele și le returnăm ca o pereche de liste.
Funcția citeste_date_intrare() citește cele două tablouri A și B din intrare și le returnează ca o pereche de liste. Funcția valideaza_datele_intrare(a, b) verifică dacă cele două liste respectă constrângerile impuse de problemă și returnează True dacă da și False altfel. Funcția se_poate_reduce(a, b) verifică dacă tabloul A se poate reduce la tabloul B și returnează True dacă da și False altfel.
În funcția verifica_reducere parcurgem lista b și pentru fiecare element verificăm dacă se poate obține ca sumă a unor elemente consecutive din lista a. Pentru aceasta, ținem cont de poziția curentă j în lista a și calculăm suma s a elementelor consecutive din această listă începând de la poziția j până când această sumă depășește elementul curent din lista b sau ajungem la sfârșitul listei a. Dacă la sfârșitul verificării suma s nu este egală cu elementul curent din lista b, atunci lista a nu se poate reduce la lista b și funcția returnează False.
 
În blocul if __name__ == '__main__' citim numărul de teste, apoi citim datele de intrare pentru fiecare test și verificăm dacă lista a se poate reduce la lista b. Rezultatul verificării este afișat pe ecran.
În funcția principală (if __name__ == '__main__':) se citește numărul de seturi de date de test t, apoi se parcurg t iterații pentru a procesa fiecare set de date. Se citesc cele două tablouri, se validează și se verifică dacă A se poate reduce la B și se afișează rezultatul.

Revision as of 18:17, 27 April 2023

Sursa: 0071 - Reducere


Cerinţa

Se consideră două tablouri unidimensionale A și B cu elemente numere naturale din intervalul [1,10000]. Spunem că tabloul A se poate reduce la tabloul B dacă există o împărțire a tabloului A în secvențe disjuncte de elemente aflate pe poziţii consecutive în tabloul A astfel încât prin înlocuirea secvențelor cu suma elementelor din secvență să se obţină, în ordine, elementele tabloului B. Se dau două tablouri A și B. Să se verifice dacă tabloul A se poate reduce la tabloul B.

Programul va citi mai multe seturi de date, fiecare constând în doi vectori A, B și va afișa pentru fiecare set de date dacă tabloul A se poate reduce la tabloul B.

Date de intrare

Programul citește un număr natural T, reprezentând numărul de seturi de date de test care urmează. Urmează T seturi de date, descrise astfel:

  • se citește n
  • se citesc n valori, reprezentând elementele tabloului A
  • se citește m
  • se citesc m valori, reprezentând elementele tabloului B

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou numărul c, reprezentând valoarea cerută. În cazul contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".

Restricţii şi precizări

  • 0 < n, m < 1001
  • elementele vectorilor A, B sunt numere naturale din intervalul [1,10000]

0 < T ≤ 10

Exemplu

Intrare
2
12
7 3 4 1 6 4 6 9 7 1 8 7
4
14 7 26 16
5
1 4 2 2 3
3
5 3 4
Ieșire
Datele nu corespund restricțiilor impuse.
1
0

Rezolvare

Rezolvare ver. 1

<syntaxhighlight lang="python" line>

  1. 0071 - Reducere

def citeste_date_intrare():

   n = int(input())
   a = list(map(int, input().split()))
   m = int(input())
   b = list(map(int, input().split()))
   return a, b

def valideaza_datele_intrare(a, b):

   if not(0 < len(a) < 1001 and 0 < len(b) < 1001):
       return False
   if not(all(1 <= x <= 10000 for x in a) and all(1 <= x <= 10000 for x in b)):
       return False
   return True

def se_poate_reduce(a, b):

   i, j = 0, 0
   while i < len(a) and j < len(b):
       s = a[i]
       i += 1
       while i < len(a) and s < b[j]:
           s += a[i]
           i += 1
       if s != b[j]:
           return False
       j += 1
   return j == len(b)

if __name__ == '__main__':

   t = int(input())
   for _ in range(t):
       a, b = citeste_date_intrare()
       if valideaza_datele_intrare(a, b):
           if se_poate_reduce(a, b):
               print("Datele sunt introduse corect.")
               print(1)
           else:
               print("Datele sunt introduse corect.")
               print(0)
       else:
           print("Datele nu corespund restricțiilor impuse.")


</syntaxhighlight>

Explicatie Rezolvare

Funcția citeste_date_intrare() citește cele două tablouri A și B din intrare și le returnează ca o pereche de liste. Funcția valideaza_datele_intrare(a, b) verifică dacă cele două liste respectă constrângerile impuse de problemă și returnează True dacă da și False altfel. Funcția se_poate_reduce(a, b) verifică dacă tabloul A se poate reduce la tabloul B și returnează True dacă da și False altfel.

În funcția principală (if __name__ == '__main__':) se citește numărul de seturi de date de test t, apoi se parcurg t iterații pentru a procesa fiecare set de date. Se citesc cele două tablouri, se validează și se verifică dacă A se poate reduce la B și se afișează rezultatul.