問題描述
小明發現有很多方案可以把一個很大的正整數拆成若干個正整數的和。他采用了其中兩種方案,分別將它們列為兩個數組:
{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 ≤ 103
- 對于 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