P11723 Solution

· · 题解

题目传送门

简单题。开两个数组 evenodd 分别存储所有偶数/奇数卡牌上的整数,然后对于每个数 A_i,如果它是偶数就存到 even 数组,否则就存到 odd 数组。因为是求最大得分,所以把两个数组从大到小排序,如果偶数超过 K 个,就取前 K 个求和,奇数同理,如果超过 K 个就取前 K 个求和,然后输出偶数和与奇数和的最大值。

#include <iostream>
#include <algorithm>

using namespace std;
using LL = long long;

const int N = 1e5 + 5;
LL cur, even[N], cnt, odd[N];

int main()
{
    int n, k;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)
    {
        LL x;
        cin >> x;
        if (!(x % 2)) even[++cur] = x;
        else odd[++cnt] = x;
    }
    sort(even + 1, even + 1 + cur, greater<LL>());
    sort(odd + 1, odd + 1 + cnt, greater<LL>());
    LL esum = 0, osum = 0;
    if (cur >= k)
    {
        for (int i = 1; i <= k; i++)
            esum += even[i];
    }
    if (cnt >= k)
    {
        for (int i = 1; i <= k; i++)
            osum += odd[i];
    }
    cout << max(esum, osum);
    return 0;
}