1. 题目描述
2. 解题思路
(1) 对cards
从大到小排序,使用贪心
的思想;
(2) 遍历前cnt
张卡牌,求出总和sum
,并记录下其中最小的偶数值
与最小的奇数值
,用于后续更新;
(3) 判断sum
的奇偶性,若为偶数则直接返回;
(4) 若为奇数,则先判断是否存在奇数值与偶数值的卡牌,若存在则与后面元素中最大的与其奇偶性不同的卡牌交换。
3. 代码实现
class Solution {
public:
int maxmiumScore(vector<int>& cards, int cnt) {
// 对卡牌从大到小排序
ranges::sort(cards, greater());
// 可能替换的卡牌为前cnt个卡牌中的最小的偶数或是最小的奇数
// 记录下最小的偶数与最小的奇数
int odd = -1, even = -1;
int sum = 0;
for (int i = 0; i < cnt; i++) {
sum += cards[i];
if (cards[i] & 1) {
odd = cards[i];
} else {
even = cards[i];
}
}
// 前cnt个卡牌的得分为偶数
if (sum % 2 == 0)
return sum;
function<int(int)> replace = [&](int x) -> int {
for (int i = cnt; i < cards.size(); i++) {
if (cards[i] % 2 != x % 2) {
return sum - x + cards[i];
}
}
return -1;
};
int res = -1;
// 前cnt个卡牌的得分为奇数
// 存在一个最小的奇数
if (odd != -1)
res = max(res, replace(odd));
// 存在一个最小的偶数
if (even != -1)
res = max(res, replace(even));
return res;
}
};