1253

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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

注意

  1. J Q K相当于11、12、13,即是扑克为1-13点数,每种4张
  2. python 在全局变量作为引用不需要添加关键字global,无论是列表,还是变量;
    修改全局变量,需要在函数中修改,需要添加global,避免歧义;
    特别地,列表、字典等只是修改其中元素的值,可以不需要global。

算法

python v1.0:

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

 【蓝桥杯训练】第一天1253 随笔

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

python v2.0:

  1. 采用dfs(深度优先搜索方法),往前搜索13层即可,每层可能选择0,1,2,3,4张牌
  2. 设置好出口条件,以dfs(0,0)开始。dns(0,1) 表示当前在拿第一层的牌,一张

题解

python v1.0:

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
****************************************************************/

python v2.0:

def dns(a, b):
    # dns(0,1) 表示当前在拿第一层的牌,一张
    if a == 13 and b <= 13:
        global res# 修改全局变量声明
        res = res + 1
        return
    if a > 13 or b > 13:
        return
    for i in range(4+1):
        dns(a + i, b + 1)
res = 0
dns(0,0)
print(res)
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄