阅读量:0
题目:
心算项目的挑战比赛中,要求选手从N张卡牌中选出cnt张卡牌,若这cnt张卡牌数字总和为偶数,则选手成绩「有效」且得分为cnt张卡牌数字总和。给定数组cards和cnt,其中cards[i]表示第i张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回0。
示例 :
输入 | 输出 | 解释 |
---|---|---|
cards = [1,2,8,9] cnt = 3 | 18 | 选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。 |
cards = [3,3,1] cnt = 1 | 0 | 不存在获取有效得分的卡牌方案。 |
提示:
- 1<=cnt<=cards.length<=10^5
- 1<=cards[i]<=1000
题解:
思路:
将 cards 从大到小排序后,先贪心的将后 cnt 个数字加起来,若此时 sum 为偶数,直接返回即可。若此时答案为奇数,有两种方案:
在数组前面找到一个最大的奇数与后 cnt 个数中最小的偶数进行替换;
在数组前面找到一个最大的偶数与后 cnt 个数中最小的奇数进行替换。
代码:Python
def leet_code(cards, cnt): cards.sort(reverse=True) # 排序,从大到小、 left, right = cards[0:cnt], cards[cnt:] num = sum(left) if num % 2 == 0: return num if num % 2 != 0 and len(cards) == cnt: return 0 odd, even = 0, 0 for i in right: # 剩余数据的最大奇数和最大偶数 if odd == 0 and i % 2 != 0: odd = i if even == 0 and i % 2 == 0: even = i ans = list() for i in left: # 所有和的可能 ans.append(num - i + odd) ans.append(num - i + even) ans.sort(reverse=True) for i in ans: # 返回最大偶数 if i % 2 == 0: return i if __name__ == '__main__': cards = [1, 2, 8, 9] cnt = 3 res = leet_code(cards, cnt) print(res)
总结:
题目内容来源于leetcode链接:心算挑战