欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 蓝桥杯 合并数列

蓝桥杯 合并数列

2025/4/2 2:59:04 来源:https://blog.csdn.net/wuqingshun314159/article/details/146601824  浏览:    关键词:蓝桥杯 合并数列

问题描述

小明发现有很多方案可以把一个很大的正整数拆成若干个正整数的和。他采用了其中两种方案,分别将它们列为两个数组:

  • {a₁, a₂, ..., aₙ}
  • {b₁, b₂, ..., bₘ}

两个数组的元素和相同

定义一次合并操作为:将某个数组中相邻的两个数合并为一个新数,新数的值为原来两个数的和。

小明希望通过若干次合并操作,使得两个数组最终变得一模一样,即满足:

  • n = m
  • 且对于任意下标 i,都有 aᵢ = bᵢ

请计算最少需要多少次合并操作可以完成小明的目标。


输入格式

输入共 3 行:

  • 第 1 行:两个正整数 nm,分别表示数组 ab 的长度。
  • 第 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com