算法学习

Posted ZT1994

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习相关的知识,希望对你有一定的参考价值。

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 

 

以上是关于算法学习的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

系统入门深度学习,直击算法工程师m

机器学习3_EM算法与混合高斯模型

IOS开发-OC学习-常用功能代码片段整理

java SpringRetry学习的代码片段