• 算法学习(八)


    1.Combinations Counting(组合计数)

    说明:我们有一个组合的例子——从给定的集合中选择几个元素的不同方法(不考虑顺序)。例如,如果这个男孩有4个糖果(不同种类的糖果),并且只取其中的2个,剩下的给他的妹妹,他有以下几种选择:

    A B C D - four sorts of candies
    
    A+B, A+C, A+D, B+C, B+D, C+D - six way to choose a pair of them.

    N的集合中有多少K元素的组合(假设所有N个元素都是不同的)。可以很容易地发现,数学公式是:

          N!
    ------------- = C(N, K) - the number of different combinations
    K! * (N - K)!

    X !是X的阶乘,也就是product 1 * 2 * 3 ···* X

    问题陈述:你要计算的是给定N和K的值C(N,K),尽管有些语言(例如Python和Java)有内置的长算法,如果您能找到一种方法来最小化计算中的中间结果,那将是很好的。这对于c/c++有时是至关重要的。

    输入数据将包含测试用例的数量。

    第二行包含一个测试用例,每个测试有两个值(N K)。

    对于每个案例,答案应该包含C(N,K)。

    分析:先构造阶乘函数,代入公式求解C(N,K)。

    测试数据:

    7
    89 8
    57 10
    93 86
    105 7
    83 75
    68 8
    111 7

    代码如下:

     1 cases = int(input())
     2 
     3 def fact(n):
     4     """ 构造阶乘函数"""
     5     if n == 1 or n == 0:
     6         return 1
     7     elif n > 1:
     8         return n * fact(n-1)
     9 Ans = []
    10 for i in range(cases):
    11     case = input().split()
    12     N = int(case[0])
    13     K = int(case[1])
    14     C = round(fact(N) / (fact(K) * fact(N - K)))  # 代入公式求解
    15     Ans.append(C)
    16 
    17 for n in Ans:
    18     print(int(n), end=' ') # 格式化输出
    19 
    20 输出:70625252863 43183019880 9473622444 22760723700 39443226966 7392009768 33963647355 

    2.Blackjack Counting(21点计数)

    说明:Blackjack的游戏规则非常简单:玩家要比对手收集更多的点数,但不超过21(参考维基百科的完整规则)。该牌中从2到10的所有牌,这些牌都是根据它们本身的值来计算的,而国王、皇后和杰克,每张牌的数值是10分,Ace的值可以算为1或11分,当点数加上11点大于21点,显然Ace应该算做1点。

    让我们学习这类游戏的计分算法的编程。

    输入数据第一行中将包含测试用例数。

    测试用例在不同的行。每一个测试用例由几个用符号表示的卡片组成:

    2 3 4 5 6 7 8 9,

    T J Q K值为10,Jack,皇后,国王,

    Ace - A

    答案应该包含每一个测试用例的点数,不超过21,如果总数大于21(即玩家立即失去),则是失败(Bust)。

    例如:

    input data:
    4
    A T
    2 K 4
    3 A Q 8
    A 3 3 3 A
    
    answer:
    21 16 Bust 21

    测试数据:

    28
    2 3 J 7
    A Q
    K 7
    A K
    A 4 5
    A A J 9
    4 3 6 7
    8 6 8
    A A A K K
    7 6 5
    2 A T A 7
    6 6 5
    A 2 T A A A
    A A 7
    5 7 8
    K A
    4 9 T
    T 7
    T A
    5 2 J
    T 9
    K 6
    7 T
    5 A
    A 7
    J Q
    A A 6
    K 7

    代码如下:

     1 num1 = ['2', '3', '4', '5', '6', '7', '8', '9']
     2 num2 = ['T', 'J', 'Q', 'K']
     3 test_cases = int(input())  # 测试用例数
     4 
     5 for i in range(test_cases):
     6     case = input().split() # 每个测试用例
     7     points = 0  # 初始化点的值为0
     8     ans = []
     9     for n in range(len(case)):
    10         if case[n] in num1:
    11             points += int(case[n])
    12         elif case[n] in num2:
    13             points += 10
    14         elif case[n] == 'A' and points + 11 > 21:  # 当含有A并且,加上11点后,值大于21点时,A应算作1点
    15             points += 1
    16         elif case[n] == 'A' and points + 11 <= 21: # 当含有A并且,加上11点后,值不大于21点时,A应算作11点
    17             points += 11
    18     if points > 21:  # 总的点数大于21点,失败
    19         print('Bust', end=' ')
    20     else:  # 总点数不大于21点,打印点数
    21         print(points, end='')
    22 
    23 输出:Bust 21 17 21 20 Bust 20 Bust Bust 18 Bust 17 Bust 19 20 21 Bust 17 21 17 19 16 17 16 18 20 18 17 
  • 相关阅读:
    更新证书错误Code Sign error: Provisioning profile ‘XXXX'can't be found
    解决Xcode 5下使用SVN出现 The operation couldn’t be completed. (NSURLErrorDomain error -1012.) 问题
    Android模拟器启动不了解决办法
    在AndroidManifest.xml文件中设置Android程序的启动界面方法
    Windows2008+MyEclipse10+Android开发环境搭配
    ADT下载地址整理
    android:inputType常用取值
    VS2010中使用Jquery调用Wcf服务读取数据库记录
    Linux手动安装netcore3.0
    StdOS之运行指示灯
  • 原文地址:https://www.cnblogs.com/zt19994/p/7397475.html
Copyright © 2020-2023  润新知