0071 - Reducere: Difference between revisions
No edit summary |
No edit summary |
||
Line 15: | Line 15: | ||
== Date de ieșire == | == 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 == | == 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(): | ||
n = int(input()) | n = int(input()) | ||
a = | a = list(map(int, input().split())) | ||
m = int(input()) | m = int(input()) | ||
b = | b = list(map(int, input().split())) | ||
return a, b | return a, b | ||
def | 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)): | |||
s = | return False | ||
while | return True | ||
s += a[ | |||
def se_poate_reduce(a, b): | |||
if s != | 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 | j += 1 | ||
return j == len(b) | |||
if __name__ == '__main__': | if __name__ == '__main__': | ||
t = int(input()) | t = int(input()) | ||
for | for _ in range(t): | ||
a, b = citeste_date_intrare() | a, b = citeste_date_intrare() | ||
if | 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( | print("Datele nu corespund restricțiilor impuse.") | ||
Line 74: | Line 88: | ||
== Explicatie Rezolvare == | == 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 | Î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>
- 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.