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
nvalori, reprezentând elementele tablouluiA - se citește
m - se citesc
mvalori, reprezentând elementele tablouluiB
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,Bsunt 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.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
for(int i = 0 ; i < t ; ++i)
{
int n , m;
int a[1001] , b[1001];
cin >> n;
for(int j = 0 ; j < n ; ++j)
cin >> a[j];
cin >> m;
for(int j = 0 ; j < m ; ++j)
cin >> b[j];
int cnt=0;
int ok=0;
for(int j = 0 ; j < m ; ++j)
{
int s=0;
for(int k = ok ; k < n ; ++k)
{
s+=a[k];
ok++;
if(s >= b[j])
break;
}
if(b[j]==s)
cnt++;
}
if(cnt==m && ok==n)
cout << 1 << endl;
else
cout << 0 << endl;
}
}