问题描述
小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案,分别将他们列为两个数组 {a1,a2,...,an}{a1,a2,...,an} 和 {b1,b2,...,bm}{b1,b2,...,bm}。两个数组的和相同。
定义一次合并操作可以将某数组内相邻的两个数合并为一个新数,新数的值是原来两个数的和。小明想通过若干次合并操作将两个数组变成一模一样,即 n=mn=m 且对于任意下标 ii 满足 ai=biai=bi。请计算至少需要多少次合并操作可以完成小明的目标。
输入格式
输入共 33 行。
第一行为两个正整数 nn, mm。
第二行为 nn 个由空格隔开的整数 a1,a2,...,ana1,a2,...,an。
第三行为 mm 个由空格隔开的整数 b1,b2,...,bmb1,b2,...,bm。
输出格式
输出共 11 行,一个整数。
样例输入
4 3
1 2 3 4
1 5 4
样例输出
1
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int i=1,j=1;
int a[N],b[N];
long long int s1[N],s2[N];
int n,m;
int ans=0;
int main ()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s1[i]=s1[i-1]+a[i];
}
for(int j=1;j<=m;j++)
{
scanf("%d",&b[j]);
s2[j]=s2[j-1]+b[j];
}
while(i<=n&&j<=m)
{
if(s1[i]==s2[j])
{
i++;
j++;
}
if(s1[i]>s2[j])
{
j++;
ans++;
}
if(s1[i]<s2[j])
{
i++;
ans++;
}
}
cout<<ans<<endl;
return 0;
}
//by crtzk7
样例说明
只需要将 a2a2 和 a3a3 合并,数组 aa 变为 {1,5,4}{1,5,4},即和 bb 相同。
评测用例规模与约定
对于 20%20% 的数据,保证 nn, m≤103m≤103。
对于 100%100% 的数据,保证 nn, m≤105m≤105,0<ai0<ai, bi≤105bi≤105。
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
PyPy3 | 3s | 256M |
Go | 3s | 256M |
JavaScript | 3s | 256M |