1 条题解

  • 0
    @ 2026-6-19 10:30:16

    📝 题目大意

    给定 NN 个互不相同的非负整数,从中选出两个数,使得它们的和为偶数。求所有满足条件的数对中,和的最大值;若不存在这样的数对,输出 1-1

    💡 解题思路

    1. 题目分析:两个数之和为偶数,当且仅当两个数同奇偶(即两个偶数相加,或两个奇数相加)。因此只需分别在偶数和奇数中找出最大的两个数,取它们的和的最大值即可。约束 N2×105N \leq 2 \times 10^5Ai109A_i \leq 10^9,和最大可能达到 2×1092 \times 10^9,需使用 long long

    2. 算法推导

      • 遍历数组,将元素按奇偶性分别存入 evenodd 两个数组。
      • 对两个数组分别排序,取出最大的两个元素(即末尾两个元素)。
      • 若偶数数组大小 2\ge 2,则用 even[m-1] + even[m-2] 更新答案 ans
      • 若奇数数组大小 2\ge 2,则用 odd[m-1] + odd[m-2] 更新答案 ans
      • 最终 ans 即为最大偶数和,若 ans 仍为 1-1 则说明无解。
    3. 边界与细节

      • 当偶数或奇数个数不足 2 时,该组无法构成合法数对,跳过即可。
      • 答案初始化为 1-1,若两组均无法构成合法数对,最终输出 1-1
      • 注意 AiA_i 可达 10910^9,和可能超过 int 范围,必须使用 long longstd.cppvector<long long>ans 均使用了 long long)。

    ⏱️ 复杂度分析

    • 时间复杂度O(NlogN)O(N \log N),主要开销来自对两个数组的排序。
    • 空间复杂度O(N)O(N),需要存储 evenodd 两个数组。

    💻 标准代码 (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
    上传者