【蓝桥杯训练】第一天1253

1253

[蓝桥杯2015初赛]牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序
自己手里能拿到的初始牌型组合一共有多少种呢?
输出
请输出该整数,不要输出任何多余的内容或说明文字。

注意

  1. J Q K相当于11、12、13,即是扑克为1-13点数,每种4张

算法

  1. 首先采用枚举法,分单个点数可能有1,2,3,4张牌分别多少,共有39种分堆
  2. 利用函数算组合,让后求和
  3. zh(),是一个求组合C的函数

单个计算便是:zh(a,13)zh(b,13-a)zh(c, 13-a-b)*zh(d, 13-a-b-c)
最后累加求和即可。

题解

from functools import reduce

def zh(u, d):#计算组合
    if u == 0:
        return 1
    if u>d//2:
        u = d - u
    fenmu = reduce(multiply, [i for i in range(1, u+1)],1)
    # print(fenmu)
    fenzi = reduce(multiply, [i for i in range(d, d-u,-1)],1)
    # print(fenzi)
    return fenzi//fenmu

def accumulate(data):
    a, b, c, d = data
    mul = zh(a,13)*zh(b,13-a)*zh(c, 13-a-b)*zh(d, 13-a-b-c)
    return mul

multiply = lambda a, b : a*b
# print(zh(24,25))
# count = 0
array = []
for i in range(14):
    for j in range(7):
        for k in range(5):
            s = 13 - (1*i + 2*j + 3*k)
            if s >= 0 and s%4 == 0:
                # count = count + 1
                array.append([i, j, k, int(s/4)])
# print(len(array))
sum = 0
for i in range(len(array)):
    #print(array[i])
    sum += accumulate(array[i])
#print()
print(sum)

结果:

print('3598180')
/**************************************************************
    Problem: 1253
    User: yanshanbei
    Language: Python
    Result: 正确
    Time:21 ms
    Memory:26796 kb
****************************************************************/

猜你喜欢

转载自www.cnblogs.com/yanshanbei/p/12207806.html