问题描述
小明发现有很多方案可以把一个很大的正整数拆成若干个正整数的和。他采用了其中两种方案,分别将它们列为两个数组:
{a₁, a₂, ..., aₙ}
{b₁, b₂, ..., bₘ}
两个数组的元素和相同。
定义一次合并操作为:将某个数组中相邻的两个数合并为一个新数,新数的值为原来两个数的和。
小明希望通过若干次合并操作,使得两个数组最终变得一模一样,即满足:
n = m
- 且对于任意下标
i
,都有aᵢ = bᵢ
请计算最少需要多少次合并操作可以完成小明的目标。
输入格式
输入共 3 行:
- 第 1 行:两个正整数
n
和m
,分别表示数组a
和b
的长度。 - 第 2 行:
n
个由空格隔开的整数,表示数组a
。 - 第 3 行:
m
个由空格隔开的整数,表示数组b
。
输出格式
输出 1 行,一个整数,表示最少需要的合并次数。
样例输入
4 3
1 2 3 4
1 5 4
样例输出
1
样例说明
只需要将 a₂
和 a₃
合并为 5,数组 a
变为 {1, 5, 4}
,与数组 b
相同。
评测用例规模与约定
- 对于 20% 的数据,保证
n, m ≤ 10³
- 对于 100% 的数据,保证:
n, m ≤ 10⁵
0 < aᵢ, bᵢ ≤ 10⁵
#include<bits/stdc++.h>
#include<stdio.h>using namespace std;int n, m, ans = 0;int main() {scanf("%d %d", &n, &m);vector<int> arr1(n), arr2(m);for (int i = 0; i < n; i++) {scanf("%d", &arr1[i]);}for (int i = 0; i < m; i++) {scanf("%d", &arr2[i]);}int l = 0, r = 0;while(l < n || r < m) {if (arr1[l] == arr2[r]) {l++;r++;}else if (arr1[l] > arr2[r]) {arr2[r + 1] += arr2[r];r++;ans++;}else{arr1[l + 1] += arr1[l];l++;ans++;}}cout << ans;return 0;
}//by wqs