公式

C - Max Even 解説 by nok0


\(2\) 要素の和が偶数になるのは、偶数と偶数を足したときか奇数と奇数を足したときです。

それぞれの場合を試します。

偶数を \(2\) 個選び、和を最大化する問題を考えます。 まず、偶数が \(1\) 個しか存在しない場合を場合分けで処理します。以下、偶数が \(2\) 個以上存在する場合のみを考えます。

\(A\) に含まれる偶数を降順に並び替えると、和が最大になるのは先頭の値と \(2\) 番目の値を足したときです。よってソートを行うことでこの問題に \(O(N\log N)\) で答えることができました。(奇数の場合も同様です。)

実装例(c++):

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> odd, even;
    for(int i = 0; i < n; i++) {
        int a;
        cin >> a;
        if(a & 1)
            odd.push_back(a);
        else
            even.push_back(a);
    }
    sort(odd.rbegin(), odd.rend());
    sort(even.rbegin(), even.rend());
    int mx = -1;
    if(odd.size() >= 2) mx = max(mx, odd[0] + odd[1]);
    if(even.size() >= 2) mx = max(mx, even[0] + even[1]);
    cout << mx << endl;
}

投稿日時:
最終更新: