def solution(n, max, array):
# Edit your code here
count =15*[0]
for card in array:
if card == 1:
card = 14
count[card]+=1
m3 = 0
m2 = 0
for i in range(14,1,-1):#反着走
if count[i] >= 3:
for j in range(14,1,-1):
if count[j]>=2 and i!=j:
if i == 14:
ix=1
else:
ix=i
if j == 14:
jx=1
else:
jx=j
if ix*3+jx*2<=max:
if i>m3 and j>m2:
m3=i
m2=j
if m3 == 14:
m3=1
if m2 == 14:
m2=1
return[m3,m2]
if __name__ == "__main__":
# Add your test cases here
print(solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) == [8, 5])
print(solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) == [6, 9])
print(solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) == [0, 0])
题目就是从2到A有13种扑克牌,A牌面最大,2牌面最小。但它们每个对应一个数字,A:1,2:2,3:3,····K:13。然后输入一堆这些牌,找五张,要求三个相同和两个相同,就是三带二。然后还有个输入max, 5张牌的牌面值加起来<max。输出最大牌面的组合。
输入: 第一行:牌数 max 第二行:各个牌的牌面值
输出: 最佳的组合[三个的,两个的]
两个概念:牌面和牌面值
这题注意的点就是A牌面值最小,是1,但它的牌面最大。也就是只有在考虑牌面值之和是否小于max这一点时候要把A考虑成1,别的时候能选A优先选A。也就是A优先级最高,牌面最大。
这题不难,但我技术太菜,想不到啥妙法。牌面值是1到13 。在满足小于max的前提下,要比较哪个牌面大,直接按数字比不好比,因为A的数字是1,最小。我想到把1换成14,这样选的时候14自然是最大的,符合A牌面最大。后面判断的时候只要按照数字大小比较就行了。这就把问题回归到数字比大小上了。小弟没找到什么方法把1换成14并且别的顺序不变,所以只能用if else了。感觉这里像循环右移。评论区大佬有没有啥妙招。
别的就没啥了。先设两个变量m3,m2。找3个相同的,紧接着找2个相同的,判断能满足小于max否。在判断是不是比已经选的m3,m2好,好就换了,不好就继续找。最后再return m3和m2。
看别的大佬用的是键值对map,感觉可以,这样不用被数组下标困住了,只要1:141对应了14,就好算了。