蓝桥杯14届国赛 合并数列
问题描述
小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案,分别将他们列为两个数组 {a1,a2,...,an} 和 {b1,b2,...,bm}。两个数组的和相同。
定义一次合并操作可以将某数组内相邻的两个数合并为一个新数,新数的值是原来两个数的和。小明想通过若干次合并操作将两个数组变成一模一样,即 n=m 且对于任意下标 i 满足 ai=bi。请计算至少需要多少次合并操作可以完成小明的目标。
输入格式
输入共 3 行。
第一行为两个正整数 n, m。
第二行为 n 个由空格隔开的整数 a1,a2,...,an。
第三行为 m 个由空格隔开的整数 b1,b2,...,bm。
输出格式
输出共 1 行,一个整数。
样例输入
4 3
1 2 3 4
1 5 4
样例输出
1
样例说明
只需要将 a2 和 a3 合并,数组 a 变为 {1,5,4},即和 b 相同。
评测用例规模与约定
对于 20% 的数据,保证 n, m≤。
对于 100% 的数据,保证 n, m≤,0<ai, bi≤
。
合并规则:按照从左至右的顺序依次比较两个数组中的对应元素,优先选取较小元素与其右边的元素进行合并。
#include<iostream>
using namespace std;const int N = 1e5+10;
int n, m;
int a[N], b[N];int ans;int main()
{cin>>n>>m;for(int i=1; i<=n; ++i) cin>>a[i];for(int i=1; i<=m; ++i) cin>>b[i];//i 和 j 同步递增,使用while循环 int i=1, j=1;while(i<=n && j<=m){if(a[i]<b[j]){a[i+1] += a[i]; //合并到下一个元素i++;ans++;}else if(b[j]<a[i]){b[j+1] += b[j];j++;ans++;}else{i++;j++;}}cout<<ans;return 0;
}