• 【蓝桥杯训练】第一天1253


    1253

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

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

    注意

    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的函数

    单个计算便是: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)
    
  • 相关阅读:
    Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0
    Codeforces 294C 组合数学
    Educational Codeforces Round 40 (Rated for Div. 2)
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛
    天梯赛和蓝桥杯省赛训练
    莫队算法
    牛客练习赛13
    51NOD-1391 预处理dp
    AtCoder Regular Contest 092
    大二下学期赛季
  • 原文地址:https://www.cnblogs.com/yanshanbei/p/12207806.html
Copyright © 2020-2023  润新知