# 104正式試題 ## pA. 電梯電費計算問題 ```python= for _ in range(int(input())): input() num = [int(i) for i in input().split(",")] now = num[0] ans = 0 for i in num[1::]: if now < i: ans += (i-now)*20 else: ans += (now-i)*10 now = i print(ans) ``` ## pB. 樂透 ```python= n = int(input()) right = [int(i) for i in input().split(",")] for _ in range(n): ans = [0, 0, 0, 0, 0, 0] num = [int(i) for i in input().split(",")] for j in range(6): e = 0 if j == 0: temp = num[1::] elif j == 5: temp = num[0:5] else: temp = num[0:j]+num[j+1::] for i in right: if i in temp: e += 1 ans[e] += 1 print(",".join(map(str, ans[2::]))) ``` ## pC. 組合問題 ```python= def DFS(i, s): if len(s) == len(i): seen.add(s) return 0 for j in i: if j not in s: DFS(i, s+j) for _ in range(int(input())): i, j, k = input().split(",") seen = set() DFS(i, "") seen = sorted(list(seen)) print(int(seen[int(j)-1])+int(seen[int(k)-1])) ``` ## pD. 最大公因數計算 ```python= def gcd(a, b): while b: a, b = b, a%b return a for _ in range(int(input())): num = [int(i) for i in input().split(",")] ans = num[0] for i in num[1::]: ans = gcd(ans, i) print(ans) ``` ## pE. 計算位元為 1 的個數 ```python= for _ in range(int(input())): print(bin(int(input())).count("1")) ``` ## pF. 矩陣的乘法 ```python= for _ in range(int(input())): m, r, r, n = map(int, input().split(",")) A = [] for _ in range(m): temp = [int(i) for i in input().split()] if 9999 in temp: find = 0 A.append(temp) B = [] for _ in range(r): temp = [int(i) for i in input().split()] if 9999 in temp: find = 1 B.append(temp) AB = [] for _ in range(m): temp = [int(i) for i in input().split()] if 9999 in temp: find = 2 AB.append(temp) flag = False for i in range(m): for c in range(n): temp = 0 for j in range(r): temp += A[i][j] * B[j][c] if AB[i][c] != temp: if find == 2: print(temp) flag = True break else: for j in range(r): if A[i][j] == 9999: a = B[j][c] elif B[j][c] == 9999: a = A[i][j] temp -= 9999*a print((AB[i][c]-temp)//a) flag = True break if flag: break ``` ## pG. 輸出二元樹的後序拜訪的結果 class 寫法 ```python= class node: def __init__(self, n): self.n = n self.left = None self.right = None def add(self, data): if data < self.n: if self.left: self.left.add(data) else: self.left = node(data) else: if self.right: self.right.add(data) else: self.right = node(data) def vis(self): if self.left: self.left.vis() if self.right: self.right.vis() ans.append(self.n) for _ in range(int(input())): input() arr = [int(i) for i in input().split(",")] N = node(arr[0]) for i in arr[1::]: N.add(i) ans = [] N.vis() print(",".join(map(str, ans))) ``` ## pH. 最小成本生成樹 chatgpt ```python= def find(parent, node): if parent[node] != node: parent[node] = find(parent, parent[node]) return parent[node] def union(parent, rank, u, v): root_u = find(parent, u) root_v = find(parent, v) if root_u != root_v: if rank[root_u] > rank[root_v]: parent[root_v] = root_u elif rank[root_u] < rank[root_v]: parent[root_u] = root_v else: parent[root_v] = root_u rank[root_u] += 1 def kruskal(graph): edges = sorted(graph['edges'], key=lambda e: e[2]) parent = {} rank = {} for node in graph['nodes']: parent[node] = node rank[node] = 0 mst = [] for u, v, weight in edges: if find(parent, u) != find(parent, v): union(parent, rank, u, v) mst.append((u, v, weight)) return mst # 範例使用 for _ in range(int(input())): arr = [([i[0], i[2], int(i[4::])]) for i in input().split()] nodes = set() for i in range(len(arr)): nodes.add(arr[i][0]) nodes.add(arr[i][1]) graph = { 'nodes': list(nodes), 'edges': arr } ans = 0 mst = kruskal(graph) for u, v, weight in mst: ans += weight print(ans) ```