2 条题解
-
0
📝 题目大意
给定两个长度为 的整数数列 和 ,可以任意选择下标 和 (),求 的最大值。
💡 解题思路
-
题目分析: 和 的选择是相互独立的—— 和 之间没有任何配对限制,任何一个 中的元素都可以与任何一个 中的元素相加。因此问题等价于:从 中选一个最大值,从 中选一个最大值,两者相加即为答案。
-
算法推导:
- 朴素思路:枚举所有 的组合,计算 并取最大值,时间复杂度 ,在 的数据范围下不可接受。
- 优化思路:由于 (加法的单调性保证:对于任意 ,有 ,而取 为 中最大值下标、 为 中最大值下标时可取到等号),因此只需分别遍历两个数组,各找出最大值,然后相加即可。
- 实现方式:用变量
max1记录 的最大值,max2记录 的最大值。初始值设为 (题目中 ,但元素可能全为负数,所以初始值设为足够小的负数)。遍历 时遇到更大的值就更新max1,遍历 时同理更新max2,最后输出max1 + max2。
-
边界与细节:
- 所有元素均为负数:此时最大值仍为两数组各自的最大值(即绝对值最小的负数)之和,初始值
max1、max2设为 (或-1e9)能正确覆盖这种情况。 - 溢出:
|A_i|, |B_j| \leq 10^9,因此最大和为 ,在 32 位有符号整数(约 )范围内,使用int类型即可。 - :直接输出 ,算法依然正确。
- 所有元素均为负数:此时最大值仍为两数组各自的最大值(即绝对值最小的负数)之和,初始值
⏱️ 复杂度分析
- 时间复杂度:遍历数组 一次、数组 一次,每次 ,总复杂度 。
- 空间复杂度:不需要存储整个数组,仅用几个变量在读入时即时处理,额外空间 。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int n, a, max1 = -1e9, max2 = -1e9; // max1 记录 A 的最大值,max2 记录 B 的最大值,初始化为足够小的负数 int main() { cin >> n; // 读入数组 A,同时找出最大值 for(int i = 0; i < n; i++) { cin >> a; if(a > max1) max1 = a; // 更新 A 的最大值 } // 读入数组 B,同时找出最大值 for(int i = 0; i < n; i++) { cin >> a; if(a > max2) max2 = a; // 更新 B 的最大值 } cout << max1 + max2; // 答案即为两数组最大值之和 return 0; } -
- 1
信息
- ID
- 835
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 2
- 上传者