题目大意:有一个长度为n的a数组,一个长度为m的b数组,其中b数组中的每一个数都是由a数组中的一些连续的数通过加和得到的,并且严格按照从左到右的顺序对应
1<=n,m<=1e5;1<=a[i],b[i]<=1e6;
思路:因为数组很短,所以可以暴力解决,我们分别记录两个数组一些数的和,分别用一个指针来维护,先右移a数组的指针,如果suma>sumb,就把b数组的指针右移,直到suma==sumb,答案计数+1,并且重置suma,sumb
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
int a[N], b[N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; i++)
{
scanf("%d", &b[i]);
}
ll suma = 0, sumb = 0;//注意1e5*1e6可能会爆int
int ra = 0, rb = 0, ans = 0;
while (ra <= n && rb <= m)
{
suma += a[++ra];//右移a数组指针,同时suma+
if (ra > n)//a数组都遍历过了就结束
break;
while (suma > sumb)
{
sumb += b[++rb];
}//suma>sumb了,就右移b数组指针
if (suma == sumb)
{
ans++;
suma = sumb = 0;
}
}
cout << ans;
return 0;
}