网站怎么做域名实名认证吗关键词搜索排名工具
题目:
心算项目的挑战比赛中,要求选手从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 numif num % 2 != 0 and len(cards) == cnt:return 0odd, even = 0, 0for i in right: # 剩余数据的最大奇数和最大偶数if odd == 0 and i % 2 != 0:odd = iif even == 0 and i % 2 == 0:even = ians = 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 iif __name__ == '__main__':cards = [1, 2, 8, 9]cnt = 3res = leet_code(cards, cnt)print(res)
总结:
题目内容来源于leetcode链接:心算挑战