这道题的思路是首先对卡牌进行降序排序,然后选择前cnt张卡牌作为初始方案。如果这些卡牌的总和是偶数,那么这就是最大有效得分。如果总和是奇数,需要找到一种方式将其转换为偶数。这可以通过替换一张卡片来实现,具体方法是:在已选择的卡牌中找到最小的偶数卡和最小的奇数卡,在未选择的卡牌中找到最大的偶数卡和最大的奇数卡。然后比较替换这些卡牌后的总和,选择一个更大的有效得分。
时间复杂度: O(n log n)
空间复杂度: O(1)
class Solution:
def maxmiumScore(self, cards: List[int], cnt: int) -> int:
a, b, c, d = 1001, 1001, 0, 0 # 初始化最小的偶数卡a、最小的奇数卡b、最大的偶数卡c和最大的奇数卡d
cards = sorted(cards, reverse=True) # 降序排序卡牌
pcards, bcards, rcards = cards[:cnt], cards[cnt:], sorted(cards[:cnt]) # 分别获取已选择的卡牌、未选择的卡牌和已选择卡牌的升序列表
scards = sum(pcards) # 计算已选择卡牌的总和
if scards % 2 and not bcards: # 如果总和为奇数且没有未选择的卡牌,则无法获得有效得分
return 0
for i in bcards: # 遍历未选择的卡牌
if i % 2 == 0:
c = max(i, c) # 更新最大的偶数卡
else:
d = max(i, d) # 更新最大的奇数卡
if c and d:
break
for j in rcards: # 遍历已选择的卡牌的升序列表
if j % 2 == 0:
a = min(j, a) # 更新最小的偶数卡
else:
b = min(j, b) # 更新最小的奇数卡
if a != 1001 and b != 1001:
break
if scards % 2: # 如果总和为奇数,则通过替换卡牌使其变为偶数
return max(scards - a + d, scards - b + c)
else:
return sum(pcards) # 如果总和已经是偶数,则直接返回