# PBinfo #71 – reducere – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

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.

Cerinţa
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
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.

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

1
0
Explicație
Pentru primul set de date, 7+3+4=14, 1+6=7, 4+6+9+7=26, 1+8+7=16, deci tabloul A se poate reduce la B.

## Cod sursă C++

```cpp
#include <bits/stdc++.h>
using namespace std;
int nr, n, m, v1[1001], v2[1001];
int main() {
    cin >> nr;
    for(int tempo = 1; tempo <= nr; nr--) {
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> v1[i];
        cin >> m;
        for (int i = 1; i <= m; i++) cin >> v2[i];
        int temp = 1;
        bool adv = 1;
        for (int i = 1; i <= n && adv; i++) {
            if (v1[i] <= v2[temp]) {
                v2[temp] = v2[temp] - v1[i];
                if (v2[temp] == 0) temp++;
            } else adv = 0;
        } if (temp != m + 1) adv = 0;
        cout << adv << endl;
    } return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/71)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/71/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-71/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
