看得我束手无策,刚开始读的时候还记得是连续的元素处理,但是后来想着想着变了,自己开始无序处理元素了,就不会做了。后来看题解才发现是道简单的贪心。先把两个序列所有元素分别加和,如果不等直接输出-1结束;相等的话,就从第一位不相等的元素开始,作为部分和,比较大小,小的就加自己序列的后一个元素,继续比较大小,直到相等,开始下一次匹配;每次匹配都会使答案+1;直到下标超出两个序列其中之一的边界时,结束,输出答案。
我被坑了以下几个地方:
1. 对应参数打错了,不对应了。
2. int型数据连续加和太多次,就超范围了,必须用long long型。
3. 忘了ios::sync_with_stdio(false)和cin.tie(0)的优化。
4. 最后,数据范围看错了,我开了十万的数组,但是目标数据范围是三十万的。
代码如下,极类标准题解。
#include <bits/stdc++.h>
#define N 300005
using namespace std;
typedef long long ll;
int a[N],b[N];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
ll suma=0,sumb=0;
cin>>n;
for (int i=0;i<n;i++) {
cin>>a[i];
suma+=a[i];
}
cin>>m;
for (int j=0;j<m;j++) {
cin>>b[j];
sumb+=b[j];
}
if (suma!=sumb) {
cout<<-1<<endl;
return 0;
}
int posa=0,posb=0,ans=0;
while (posa<n&&posb<m) {
ans++;
ll sa=a[posa++],sb=b[posb++];
while (sa!=sb) {
if (sa<sb) sa+=a[posa++];
else sb+=b[posb++];
}
}
cout<<ans<<endl;
return 0;
}