1. 程式人生 > >算法學習(八)

算法學習(八)

讓我 卡片 ans return ack 好的 log 編程 其中

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 

算法學習(八)