1 条题解
-
0
📝 题目大意
给定 个互不相同的非负整数,从中选出两个数,使得它们的和为偶数。求所有满足条件的数对中,和的最大值;若不存在这样的数对,输出 。
💡 解题思路
-
题目分析:两个数之和为偶数,当且仅当两个数同奇偶(即两个偶数相加,或两个奇数相加)。因此只需分别在偶数和奇数中找出最大的两个数,取它们的和的最大值即可。约束 ,,和最大可能达到 ,需使用
long long。 -
算法推导:
- 遍历数组,将元素按奇偶性分别存入
even和odd两个数组。 - 对两个数组分别排序,取出最大的两个元素(即末尾两个元素)。
- 若偶数数组大小 ,则用
even[m-1] + even[m-2]更新答案ans。 - 若奇数数组大小 ,则用
odd[m-1] + odd[m-2]更新答案ans。 - 最终
ans即为最大偶数和,若ans仍为 则说明无解。
- 遍历数组,将元素按奇偶性分别存入
-
边界与细节:
- 当偶数或奇数个数不足 2 时,该组无法构成合法数对,跳过即可。
- 答案初始化为 ,若两组均无法构成合法数对,最终输出 。
- 注意 可达 ,和可能超过
int范围,必须使用long long(std.cpp中vector<long long>和ans均使用了long long)。
⏱️ 复杂度分析
- 时间复杂度:,主要开销来自对两个数组的排序。
- 空间复杂度:,需要存储
even和odd两个数组。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main() { int n; cin >> n; // 分别存储偶数和奇数 vector<long long> even, odd; for (int i = 0; i < n; i++) { long long x; cin >> x; // 按奇偶性分类 if (x % 2 == 0) even.push_back(x); else odd.push_back(x); } // 排序以便取最大的两个元素 sort(even.begin(), even.end()); sort(odd.begin(), odd.end()); long long ans = -1; // 初始化为 -1 表示无解 // 偶数 + 偶数 = 偶数,取最大的两个偶数 if (even.size() >= 2) { int m = even.size(); ans = max(ans, even[m - 1] + even[m - 2]); } // 奇数 + 奇数 = 偶数,取最大的两个奇数 if (odd.size() >= 2) { int m = odd.size(); ans = max(ans, odd[m - 1] + odd[m - 2]); } cout << ans << endl; } -
- 1
信息
- ID
- 643
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者