CCF-GESP 等級考試 2025年6月認證Python六級真題解析

1 單選題(每題 2 分,共 30 分)

第1題 下列哪一項不是面向對象編程(OOP)的基本特征?(?? )

A. 繼承 (Inheritance)???? ??????????????????????????????????????????? B. 封裝 (Encapsulation)

C. 多態 (Polymorphism)?????????????????????????????????????????? D. 鏈接 (Linking)

解析:答案D?面向對象編程的基本特征包含封裝、繼承、多態和抽象四大核心要素?,這四大特征共同構成了代碼組織的核心范式,有效提升了程序的可維護性、擴展性和復用性。????所以D.不是。故選D

第2題 為了讓 Dog 類的構造函數能正確地調用其父類 Animal 的構造方法,橫線線處應填入(?? )。

  1. class Animal:
  2. ????def __init__(self, name: str):
  3. ????????self.name = name
  4. ????????print("Animal created")
  5. ????def speak(self) -> None:
  6. ????????print("Animal speaks")
  7. class Dog(Animal):
  8. ????______________________________
  9. ????????print("Dog created")
  10. ????def speak(self) -> None:
  11. ????????print("Dog barks")
  12. if __name__ == "__main__":
  13. ????animal: Animal = Dog("Rex", "Labrador")
  14. ????animal.speak()

A.

  1. def __init__(self, name: str, breed: str):
  2. ????super().__init__(name)
  3. ????self.breed = breed

B.

  1. def __init__(self, name: str, breed: str):
  2. ????self.breed = breed

C.

  1. def __init__(self, name: str, breed: str):

D.

  1. ????self.breed = breed

解析:答案A?繼承父類構造函數?:子類?Dog?需要通過?super().__init__(name)?顯式調用父類?Animal?的構造函數,以確保執行父類構造函數(如?self.name = name?和打印?"Animal created")被執行。?擴展子類屬性?Dog?類新增了?breed?屬性,需要在子類構造函數中初始化?self.breed = breed。所以A.的代碼完全符合上述邏輯,而其他選項(B.C.D.)要么遺漏了?super().__init__(),要么語法不完整。故選A

第3題 代碼同上一題,代碼animal.speak()執行后輸出結果是(?? )。

A. 輸出 Animal speaks? ? ? B. 輸出 Dog barks? ? ? ? ?C. 編譯錯誤????????????? ? ? ? ? ? ?D. 程序崩潰

解析:答案?B??Dog?實例化時,通過?super().__init__("Rex")?調用父類?Animal?的構造函數,執行?print("Animal created")?并初始化?name?屬性。Dog?的構造函數繼續執行?print("Dog created")。最后調用?animal.speak(),由于?Dog?重寫了?speak?方法,輸出?"Dog barks"?,所以輸出?Dog barks。故選B

第4題 以下Python代碼執行后其輸出是(?? )。

  1. from collections import deque
  2. stack = []
  3. queue = deque()
  4. # 元素入棧/入隊(1, 2, 3)
  5. for i in range(1, 4):
  6. ????stack.append(i)
  7. ????queue.append(i)
  8. print(f"{stack[-1]} {queue[0]}")

A. 1 3??????????????????? ? ? ? ? ? ? ? ?B. 3 1????????????? ? ? ? ? ? ? ? ? ? C. 3 3???????????? ? ? ? ? ? ? ? ? ? ? ? ?D. 1 1

?解析:答案?B?棧和隊列的操作?:棧(stack)是先進后出(FILO)結構,本題用列表模擬,append(i)?依次添加?1, 2, 3,因此?stack[-1](棧頂元素,列表最后的元素)為?3。隊列(deque)是先進先出(FIFO)結構, append(i)?依次添加?1, 2, 3,因此?queue[0](隊首元素)為?1。所以?輸出結果?f"{stack[-1]} {queue[0]}"的結果為?"3 1"。故選B

第5題 在一個使用列表實現的循環隊列中,front 表示隊頭元素的位置(索引),rear 表示隊尾元素的下一個插入位置(索引),隊列的最大容量為 maxSize。那么判斷隊列已滿的條件是(?? )

A. rear == front????????????????? ????????????????????????????????????????B. (rear + 1) % maxSize == front

C. (rear - 1 + maxSize) % maxSize == front?????????????D. (rear - 1) == front

解析:答案?B?。在?循環隊列?中,判斷隊列已滿的條件需要滿足以下兩點:?隊尾指針(rear)的下一個位置是隊頭指針(front?,即?rear?即將追上?front?為了避免rear == front時出現歧義?(此時隊列可能為空也可能為滿),通常使用?(rear + 1) % maxSize == front?來判斷是否已滿rear == front?用于判斷?空隊列,所以A.錯誤。(rear - 1 + maxSize) % maxSize == front?

等價于?rear - 1 == frontC.D.相同,所以兩者都錯。故選B

第6題 在二叉樹中,只有最底層的節點未被填滿,且最底層節點盡量靠左填充的是(?? )。

A. 完美二叉樹? ? ? ? ? ? ? ? B. 完全二叉樹? ? ? ? ? ? ? ? C. 完滿二叉樹? ? ? ? ? ? ? ? D. 平衡二叉樹

解析:答案?B??完美二叉樹(Perfect Binary Tree):一個深度為k(>=1)且有2^(k-1) - 1個結點的二叉樹稱為完美二叉樹。(注:國內的數據結構教材大多翻譯為"滿二叉樹")。完全二叉樹(Complete Binary Tree):完全二叉樹從根結點到倒數第二層滿足完美二叉樹,最后一層可以不完全填充,其葉子結點都靠左對齊。完滿二叉樹(Full Binary Tree):所有非葉子結點的度都是2。(只要你有孩子,你就必然是有兩個孩子。)所以B.正確。故選B

第7題 在使用數組(列表)表示完全二叉樹時,如果一個節點的索引為𝑖(從0開始計數),那么其左子節點的索引通常是(?? )。

A.(i-1)/2? ? ? ? ? ? ? ? ??? ? ? ? ? ? ?B.i+1? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?C.i+2? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?D.2*i+1

解析:答案D?。在使用數組表示完全二叉樹時,節點的索引從?0開始?,其子節點的索引計算規則為:?左子節點?的索引為2*i + 1?右子節點?的索引為2*i + 2。例如:根節點?i = 2:左子節點?i = 2*2 + 1 = 5,右子節點?i = 2*2 + 2 = 6D.?正確。故選D

第8題 已知一棵二叉樹的前序遍歷序列為GDAFEMHZ,中序遍歷序列為ADFGEHMZ,則其后序遍歷序列為(?? )。

A. ADFGEHMZ? ? ? ? ? ? ?B. ADFGHMEZ? ? ? ? ? ? ?C. AFDGEMZH? ? ? ? ? ? ?D. AFDHZMEG

解析:答案D?。由前序遍歷序列可知根節點為G,由中序遍歷序列可知左樹為AFD,右樹為EHMZ,后序遍歷序列左樹、右樹、根節點,只有D.的結構符合。具體:前序遍歷?(根--右)的第一個元素?G??根節點??中序遍歷?(左--右)中,G?左側?ADF??左子樹?,右側?EMHZ??右子樹??前序遍歷左子樹?DAF?,中序遍歷左樹?ADFD子樹根,左節點A,右節點F。前序遍歷右子樹?EMHZ,中序遍歷右子樹EHMZE為子樹根,只有右子樹。前序遍歷E右子樹MHZ,中序遍歷E右子樹HMZM為子樹根,左節點為H,右節點為Z。構成二叉樹為:

?所以后序遍歷序列為AFDHZMEGD.?正確。故選D

第9題 設有字符集 {a, b, c, d, e},其出現頻率分別為 {5, 8, 12, 15, 20},得到的哈夫曼編碼為(?? )。

A.

  1. a: 010
  2. b: 011
  3. c: 00
  4. d: 10
  5. e: 11

B.

  1. a: 00
  2. b: 10
  3. c: 011
  4. d: 100
  5. e: 111

C.

  1. a: 10
  2. b: 01
  3. c: 011
  4. d: 100
  5. e: 111

D.

  1. a: 100
  2. b: 01
  3. c: 011
  4. d: 100
  5. e: 00

解析:答案A。哈夫曼編碼的特點,頻率低的用長編碼,頻率高的用短編碼。a最低,b次之,d次高,e最高,e短編碼、a長編碼,d短編碼,b長編碼,只有A.符合。具體:a合并b13c合并13(ab)25d合并e3525合并3560

A.?正確。故選A

第10題 3位格雷編碼中,編碼101之后的下一個編碼是(?? )。

A. 100???????????????????????? ? ? ? ? ?B. 111?????????????????? ? ? ? ? ? ?C. 110????????? ? ? ? ? ? ? ? ? ? ? ? ? D. 001

解析:答案C?。格力雷編碼中,相鄰兩處碼只有一位變化。編碼?101?在標準序列中的下一個編碼應為?100(僅最低位變化),次序與高位為0的次序相反,A.正確。111110?的下一個編碼,非?101?的相鄰碼。110??001??101?的漢明距離大于1,不符合格雷碼規則。故選A

第11題 請將下列Python實現的深度優先搜索(DFS)代碼補充完整,橫線處應填入(?? )。

  1. from typing import List, Optional
  2. class TreeNode:
  3. ????def __init__(self, val=0, left=None, right=None):
  4. ????????self.val = val
  5. ????????self.left = left
  6. ????????self.right = right
  7. def dfs_preorder(root: Optional[TreeNode], result: List[int]) -> None:
  8. ????if root is None:
  9. ????????return
  10. ????_____________________________

A.

  1. ????result.append(root.val)
  2. ????dfs_preorder(root.left, result)
  3. ????dfs_preorder(root.right, result)

B.

  1. ????result.append(root.val)
  2. ????dfs_preorder(root.left, result)

C.

  1. ????result.append(root.val)
  2. ????dfs_preorder(root.right, result)

D.

  1. ????dfs_preorder(root.left, result)
  2. ????dfs_preorder(root.right, result)

解析:答案A?。題目要求補充一個深度優先搜索(DFS)的代碼片段,二叉樹的深度優先分為:先序遍歷、中序遍歷、后序遍歷。觀察選項可以發現,除D.result.append()都在第1行,屬前序遍歷,屬前序遍歷順序是:?根節點左子樹右子樹?,因此應?result.append(root.val),再遞歸遍歷左、右子樹,所以A.正確。B.缺少右子樹的遍歷,C.缺少左子樹的遍歷,D.沒有訪問根節點,所以B.、C.、D.錯誤。故選A。

第 12 題 給定一個二叉樹,返回每一層中最大的節點值,結果以數組形式返回,橫線處應填入(?? )。

  1. from collections import deque
  2. import math
  3. from typing import List, Optional
  4. class TreeNode:
  5. ????def __init__(self, val=0, left=None, right=None):
  6. ????????self.val = val
  7. ????????self.left = left
  8. ????????self.right = right
  9. def largestValues(root: Optional[TreeNode]) -> List[int]:
  10. ????result = []
  11. ????if not root:
  12. ????????return result
  13. ????queue = deque([root])
  14. ????while queue:
  15. ????????level_size = len(queue)
  16. ????????max_val = -math.inf
  17. ????????for _ in range(level_size):
  18. ????????????________________________
  19. ????????????if node.left:
  20. ????????????????queue.append(node.left)
  21. ????????????if node.right:
  22. ????????????????queue.append(node.right)
  23. ????????result.append(max_val)
  24. ????return result

A.

  1. node = queue.popright()
  2. max_val = max(max_val, node.val)

B.

  1. node = queue.popleft()

C.

  1. max_val = max(max_val, node.val)

D.

  1. node = queue.popleft()
  2. max_val = max(max_val, node.val)

解析:答案D。題目要求實現?按層遍歷二叉樹并返回每層最大值?,使用?廣度優先搜索(BFS?,編程使用隊列。使用隊列?deque?逐層處理節點。每層開始時,用?level_size?記錄當前層節點數,遍歷當前層所有節點,記錄最大值?max_valqueue.popleft()?BFS的標準操作(先進先出),確保按層順序處理節點,max_val = max(max_val, node.val)?動態更新當前層的最大值,所以D.正確。popright()?不是?deque?的有效方法,且邏輯錯誤,所以A.錯誤。?B.缺少更新?max_val?的步驟,無法記錄最大值、?C.缺少?node = queue.popleft(),無法獲取節點值進行比較,所以B.C.錯誤。故選D

第13題 下面代碼實現一個二叉排序樹的插入函數(沒有相同的數值),橫線處應填入(?? )。

  1. class TreeNode:
  2. ????def __init__(self, val=0, left=None, right=None):
  3. ????????self.val = val
  4. ????????self.left = left
  5. ????????self.right = right
  6. def insert(root, key):
  7. ????if root is None:
  8. ????????return TreeNode(key)
  9. ????___________________________
  10. ????return root

A.

  1. ????if key < root.val:
  2. ????????root.left = insert(root.left, key)
  3. ????elif key > root.val:
  4. ????????root.right = insert(root.right, key)

B.

  1. ????if key > root.val:
  2. ????????root.left = insert(root.left, key)
  3. ????elif key > root.val:
  4. ????????root.right = insert(root.right, key)

C.

  1. ????if key < root.val:
  2. ????????root.left = insert(root.left, key)
  3. ????elif key >= root.val:
  4. ????????root.right = insert(root.left, key)

D.

  1. ????if key < root.val:
  2. ????????root.left = insert(root.right, key)
  3. ????elif key > root.val:
  4. ????????root.right = insert(root.left, key)

解析:答案A?。題目要求實現二叉排序樹(BST)的插入操作,且不允許重復值。BST的插入規則是:(1)如果當前節點為null,創建新節點。(2)如果?key??小于?當前節點值,遞歸插入?左子樹?(3)如果?key??大于?當前節點值,遞歸插入?右子樹?。因不允許重復值,所以相等不處理。??A?.正確實現BST插入邏輯(左小右大),所以正確。?B?.左小,但否則條件永不成立,所以錯誤。C. elif key >= root.val?會導致重復值(題目不允許)且全部插入到左子樹,所以錯誤。?D?. 左右子樹插入邏輯完全顛倒(左子樹插入右子樹,右子樹插入左子樹),所以錯誤。故選A

14 以下關于動態規劃算法特性的描述,正確的是(?? )。

A. 子問題相互獨立,不重疊????????????????????????????????? B. 問題包含重疊子問題和最優子結構

C. 只能從底至頂迭代求解??????????????????????????????????? ? D. 必須使用遞歸實現,不能使用迭代

解析:答案B?。動態規劃(Dynamic Programming, DP)的核心特性包括:1)?重疊子問題?:問題可以被分解為重復出現的子問題,通過記憶化或表存儲避免重復計算;2)?最優子結構?:問題的最優解包含其子問題的最優解,從而能夠遞推求解。??B?. 問題包含重疊子問題和最優子結構,正確。?A.動態規劃的子問題通常是重疊的(否則可直接用分治法解決)?,錯誤。?C.動態規劃可以從頂至底(遞歸+記憶化)或底至頂(迭代)兩種方式求解,?錯誤。?D.動態規劃的實現既支持遞歸,也支持迭代,?錯誤。故選B

第15題 給定𝑛個物品和一個最大承重為𝑊的背包,每個物品有一個重量𝑤𝑡[𝑖]和價值𝑣𝑎𝑙[𝑖],每個物品只能選擇放或不放。目標是選擇若干個物品放入背包,使得總價值最大,且總重量不超過𝑊。關于下面代碼,說法正確的是(?? )。

  1. def knapsack1D(W: int, wt: list[int], val: list[int], n: int) -> int:
  2. ????dp = [0] * (W + 1)
  3. ????for i in range(n):
  4. ????????for w in range(W, wt[i] - 1, -1):
  5. ????????????dp[w] = max(dp[w], dp[w - wt[i]] + val[i])
  6. ????return dp[W]

A. 該算法不能處理背包容量為 0 的情況

B. 外層循環 i 遍歷背包容量,內層遍歷物品

C. 從大到小遍歷 w 是為了避免重復使用同一物品

D. 這段代碼計算的是最小重量而非最大價值

正確答案:?C. 從大到小遍歷 w 是為了避免重復使用同一物品?

解析:答案C本題代碼實現的是?0/1背包問題?的經典動態規劃解法,使用一維數組?dp[w]?表示容量為?w?時的最大價值。外層循環遍歷物品(i),內層循環從大到小遍歷背包容量(w),目的是確保每個物品?僅被使用一次?。當?W=0?時,dp[0]?初始化為 0,直接返回 0,能正確處理,所以A.錯誤。外層循環遍歷物品(i),內層循環遍歷背包容量(wB.反了,所以錯誤。從大到小遍歷?w?是為了避免覆蓋?dp[w - wt[i]],從而防止同一物品被重復使用C.正確。代碼明確計算的是最大價值(max(dp[w], dp[w - wt[i]] + val[i])D.錯誤。故選C

?

2 判斷題(每題 2 分,共 20 分)

第1題 構造函數只能自動不可以被手動調用。(?? )

解析:答案錯誤。Python的構造函數(__init__?可以通過特定方式手動調用?。故錯誤。

第2題 給定一組字符及其出現的頻率,構造出的哈夫曼樹是唯一的。(?? )

解析:答案錯誤。當存在多個相同權值的節點時,合并順序不同會導致不同的樹形結構。例如,頻率集合{2,2,3,3},因同頻次序調整,可能生成多種不同形態的哈夫曼樹,但他們的帶權路徑長度(WPL)是相同的。故錯誤。

第3題 為了實現一個隊列,使其出隊操作( pop )的時間復雜度為O(1)并且避免數組刪除首元素的O(n)問題,一種常見且有效的方法是使用環形數組,通過調整隊首和隊尾指針來實現。(?? )

解析:答案正確。題目描述的實現隊列的方式是?環形數組(列表)組成循環隊列?,其核心思路確實是通過調整?隊首(front)和隊尾(rear)指針?來高效進行出入隊操作,避免移動數組元素的開銷。?環形數組的?:當隊尾指針到達數組末尾時,可以繞回到數組開頭(環形結構),避免頻繁擴容或移動元素。?入隊(push?rear = (rear + 1) % capacityO(1));?出隊(pop?front = (front + 1) % capacityO(1))。傳統數組隊列刪除首元素需要移動后續所有元素(O(n)),而環形隊列僅需移動指針(O(1))。故正確。

第4題 對一棵從小到大的二叉排序樹進行中序遍歷,可以得到一個遞增的有序序列。(?? )

解析:答案正確。二叉排序樹的定義?

左子樹的所有節點值 ?小于? 當前節點值。右子樹的所有節點值 ?大于? 當前節點值。

?中序遍歷(左--右)的特性?:先遍歷左子樹(所有值更小),再訪問根節點,最后遍歷右子樹(所有值更大)。因此,中序遍歷結果必然按?升序排列。故正確。

第5題 如果二叉搜索樹在連續的插入和刪除操作后,所有節點都偏向一側,導致其退化為類似于鏈表的結構,這時 其查找、插入、刪除操作的時間復雜度會從理想情況下的O(log n)退化到O(n log n)。(?? )

解析:答案錯誤。二叉搜索樹(BST)又稱二叉查找樹或二叉排序樹。題目考察?二叉搜索樹(BST)退化后的時間復雜度?,判斷其查找、插入、刪除操作是否會從?O(log n)?退化為?O(n log n)。理想情況(平衡BST?查找、插入、刪除的時間復雜度為O(log n)?退化情況(退化為鏈表)?:樹高度變為n,操作需遍歷所有節點,時間復雜度退化為?O(n)

?退化原因?:若插入或刪除的序列有序(如連續遞增或遞減),BST會退化為單側鏈表,樹高度從?log n?變為?n。如上圖所示。?查找?:需遍歷整條,時間復雜度?O(n)?插入/刪除?:同樣需遍歷到末端或目標位置,時間復雜度O(n),而不是O(n log n),所以錯誤。

第6題 執行下列代碼, my_dog.name 的最終值是 Charlie 。(?? )

  1. class Dog:
  2. ????def __init__(self, name):
  3. ????????self.name = name
  4. if __name__ == "__main__":
  5. ????my_dog = Dog("Buddy")
  6. ????my_dog.name = "Charlie"

解析:答案正確。?構造函數初始化?(第2行):def __init__(self, name):為傳入的name字符串。第6行用Dog類建my_dog對象my_dog=Dog("Buddy")?會調用構造函數,將?name?初始化為?"Buddy"。第7行給對象成員賦值,?修改成員變量,my_dog.name = "Charlie" 顯式修改name的值為"Charlie"my_dog.name?的最終值為?"Charlie",所以正確。

第7題 下列 python 代碼可以成功執行,并且子類 Child 的實例能通過其成員函數訪問父類 Parent 的屬性 _value 。(?? )

  1. class Parent:
  2. ????def __init__(self):
  3. ????????self._value = 100
  4. class Child(Parent):
  5. ????def get_protected_val(self):
  6. ????????return self._value

?解析:答案:正確?Child?繼承自?Parent,因此?Child?的實例會調用?Parent.__init__()?并初始化?self._value(值為100)。_value?是單下劃線前綴的受保護屬性(約定俗成,非語法強制),子類可通過?self._value?直接訪問。get_protected_val()?方法返回?self._value,邏輯正確。故正確。

第8題 下列代碼中的 tree 列表,表示的是一棵完全二叉樹 ( -1 代表空節點)按照層序遍歷的結果。(?? )

  1. tree = [1, 2, 3, 4, -1, 6, 7]

解析:答案?錯誤??完全二叉樹的定義?除最后一層外,其他層節點必須?完全填充?(無空缺)。最后一層節點?從左到右連續排列?(不能有中間空缺)。層序遍歷結果:[1, 2, 3, 4, -1, 6, 7]-1 表示空節點)。

?3層(節點索引4?:值為 -1(空節點,參考上圖),但后續仍有 6 7 節點。?違反完全二叉樹?最后一層節點?從左到右連續排列?(不能有中間空缺)”的規則,該樹不是完全二叉樹,所以錯誤。

第9題 在樹的深度優先搜索(DFS)中,可以使用棧作為輔助數據結構以實現“先進后出”的訪問順序。(?? )

解析:答案??正確?。樹的深度優先搜索(DFS)確實使用??作為輔助數據結構,其先進后出FILO)特性確保優先深入探索分支,符合DFS的核心邏輯。故正確。

第10題 下面代碼采用動態規劃求解零錢兌換問題:給定 𝑛 種硬幣,第 𝑖 種硬幣的面值為 𝑐𝑜𝑖𝑛𝑠[𝑖 ? 1] ,目標金額為 𝑎𝑚𝑡 ,每種硬幣可以重復選取,求能夠湊出目標金額的最少硬幣數量;如果不能湊出目標金額,返回 -1 。(?? )

  1. def coinChangeDPComp(coins: list[int], amt: int) -> int:
  2. ????n = len(coins)
  3. ????MAX = amt + 1
  4. ????dp = [MAX] * (amt + 1)
  5. ????dp[0] = 0
  6. ????for i in range(1, n + 1):
  7. ????????for a in range(1, amt + 1):
  8. ????????????if coins[i - 1] > a:
  9. ????????????????dp[a] = dp[a]
  10. ????????????else:
  11. ????????????????dp[a] = min(dp[a], dp[a - coins[i - 1]] + 1)
  12. ????return dp[amt] if dp[amt] != MAX else -1

?解析:答案??正確??動態規劃狀態定義?dp[a]表示湊出金額a所需的最少硬幣數,初始化時設為MAX不可達狀態)。dp[0] = 0是邊界條件,表示金額為0時不需要硬幣。?狀態轉移方程?對于每種硬幣coins[i-1],若其面值小于等于當前金額a,則更新dp[a]min(dp[a], dp[a - coins[i-1]] + 1)。若硬幣面值大于 a,則保持dp[a]不變(代碼第12-16行)。?遍歷順序?外層循環遍歷硬幣種類(i),內層循環遍歷金額(a),確保每種硬幣可重復使用(完全背包問題)。若 dp[amt] 未被更新(仍為 MAX),說明無法湊出目標金額,返回 -1;否則返回 dp[amt]。所以代碼邏輯正確,符合動態規劃解決零錢兌換問題的標準實現。故正確。

3 編程題(每題 25 分,共 50 分)

3.1 編程題1

  • 試題名稱:學習小組
  • 時間限制:3.0 s
  • 內存限制:512.0 MB

3.1.1 題目描述

班主任計劃將班級里的𝑛名同學劃分為若干個學習小組,每名同學都需要分入某一個學習小組中。觀察發現,如果一個學習小組中恰好包含𝑘名同學,則該學習小組的討論積極度為a?。

給定討論積極度a?, a?,...,a?,請你計算將這𝑛名同學劃分為學習小組的所有可能方案中,討論積極度之和的最大值。

3.1.2 輸入格式

第一行,一個正整數𝑛,表示班級人數。

第二行,𝑛個非負整數a?, a?,...,a?,表示不同人數學習小組的討論積極度。

3.1.3 輸出格式

輸出共一行,一個整數,表示所有劃分方案中,學習小組討論積極度之和的最大值。

3.1.4 樣例

3.1.4.1 輸入樣例1

  1. 4
  2. 1 5 6 3

3.1.4.2 輸出樣例1

  1. 10

3.1.4.3 輸入樣例2

  1. 8
  2. 0 2 5 6 4 3 3 4

3.1.4.4 輸出樣例2

  1. 12

3.1.5 數據范圍

對于40%的測試點,保證1≤𝑛≤10。

對于所有測試點,保證1≤𝑛≤1000,0≤a?≤10?。

3.1.6 編寫程序思路

分析:題目是分組優化問題:給定?n?名同學和一組討論討論積極度a??,a??,...,a??(其中a?表示一個小組恰好有k名同學時的討論積極度),目標是將所有同學劃分為若干個學習小組(每個小組至少包含 1 名同學),使得所有小組的討論討論積極度之和最大。每個同學必須被分配到恰好一個小組中,小組大小k可以是1n之間的任意整數,且小組大小k對應的討論積極度a??由輸入給出(非負整數)。?目標函數?:最大化所有小組的討論積極度之和。?該問題可以建模為一個完全背包問題:"物品" 對應于小組大小kk=1,2,...,n),每種物品可以無限次使用(即可以創建多個相同大小的小組);"物品重量" 為小組大小k"物品價值" 為討論積極度a??"背包容量" 為總人數n,要求恰好裝滿背包(所有同學都被分配)。可以使用動態規劃(DP)求解,狀態定義為:dp[i]?表示分配i?名同學時能獲得的最大討論積極度之和。初始狀態:dp[0]=00名同學時討論積極度為0)。狀態轉移:對于i名同學,枚舉最后一個小組的大小k1≤k≤i),則剩余i?k名同學的最優解為dp[i?k],因此:。最終答案為dp[n]。完整參考實現代碼如下:

n = int(input())???????                      #同學總數
a = [0] + [int(i) for i in input().split()]? #n個不同人數學習小組的討論積極度。
dp = [0] * (n + 1)?????                      #初始化討論度為0
for i in range(1, n+1):                      #對每一個同學for k in range(1, i+1):dp[i] = max(dp[i], dp[i - k] + a[k]) #狀態轉移公式
print(dp[n])

3.2 編程題2

  • 試題名稱:最大因數
  • 時間限制:6.0 s
  • 內存限制:512.0 MB

3.2.1 題目描述

給定一棵有10?個結點的有根樹,這些結點依次以1,2,...,10?編號,根結點的編號為1。對于編號為k(2≤k≤10?)的結點,其父結點的編號為k的因數中除k以外最大的因數。 現在有q組詢問,第i(1≤k≤q)組詢問給定x?,y?,請你求出編號分別為x?,y?的兩個結點在這棵樹上的距離。 兩個結點之間的距離是連接這兩個結點的簡單路徑所包含的邊數。

3.2.2 輸入格式

第一行,一個正整數q,表示詢問組數。

接下來q行,每行兩個正整數x?,y?,表示詢問結點的編號。

3.2.3 輸出格式

輸出共q行,每行一個整數,表示結點x?,y?之間的距離。

3.2.4 樣例

3.2.4.1 輸入樣例1

  1. 3
  2. 1 3
  3. 2 5
  4. 4 8

3.2.4.2 輸出樣例1

  1. 1
  2. 2
  3. 1

3.2.4.3 輸入樣例2

  1. 1
  2. 120 650

3.2.4.4 輸出樣例2

  1. 9

3.2.5 數據范圍

對于60% 的測試點,保證1≤x?,y?≤1000。

對于所有測試點,保證1≤q≤1000,1≤x?,y?≤10?。

3.2.6 編寫程序思路

分析:題目給出了一棵特殊的樹,其節點編號從110?,根節點為1。對于編號為kk ≥ 2)的節點,其父節點是k?k以外最大的因數?。例如:節點2的父節點是12的因數有12,除2外最大是1);節點3的父節點是13的因數有13);節點4的父節點是24的因數有124,除4外最大是2);節點6的父節點是36的因數有1236,除6外最大是3)。特點是質數全連在根結點上,質數與根1的距離為1,質數間距離為2?路徑長度?:如果兩個節點xy在樹上的距離是d,那么它們的?最近公共祖先(LCA?會出現在路徑中。因此,我們可以先找到xyLCA,然后計算從xLCA的距離和從yLCA的距離,最后相加。如預先計算LCA,則時間復雜度為O(n log n),對后40%數據會超時。

解決方案:由于樹高不超過O(log n),對n=10?樹高不超過30?對于每個查詢(x, y),先分別求xy的節點序列直到根節點,再從分別從xy開始邊計算距離邊找它們的LCA,兩距離和即為結果。如120:節點序列為120,60,30,15,5,1(最小因素2,2,2,3,5)650:節點序列為650,325,65,13,1(最小因素2,5,5,13)LCA11201的邊數為56501的邊數為4,故距離為9

找因素的時間復雜度為O(n1?2)?,找LCA求距離的時間復雜度O(log n)。總時間復雜度為O(q*n1?2*log n))。對60%的數據n≤1000O(q*n1?2*log n))<600*31.63* 9.966=<189135,可忽略;對40%的數據n≤10?O(q*n1?2*log n)) <400*32000*30=38400000010?級,基本不會超時。完整參考代碼如下:

q = int(input())???????????????? #節點組數
def factor(x):c = [x]                      #c[0]為初始節點為x,索引大于0為前一個節點的父節點for i in range(2, int(x**0.5+1e-7)+1): #整數唯一分解定理,因子為不下降序列while c[-1] % i == 0:??? #求最小因數i。c.append(c[-1] // i) #i為最小因素(除以i為最大),添加前一個節點的父節點if c[-1] > 1:??????????????? #最后一個質因素c.append(1)????????????? #添加根節點return c???????????????????? #節點序列for i in range(q): #q組節點對x, y = [int(i) for i in input().split()] #輸入兩個節點a = factor(x)???????? #返回a[0]為x節點,其他為其上的父節點直到根節點1b = factor(y)???????? #返回b[0]為y節點,其他為其上的父節點直到根節點1px, py = 0, 0while a[px] != b[py]: #求x、y到最近公共祖先(a[px]==b[py])距離px、pyif a[px] > b[py]:px += 1else:py += 1print(px + py)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90521.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90521.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90521.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++中的deque

1. 什么是 Deque&#xff1f; 核心概念&#xff1a; Deque 是 “Double-Ended Queue”&#xff08;雙端隊列&#xff09;的縮寫。你可以把它想象成一個可以在兩端&#xff08;頭部和尾部&#xff09;高效地進行添加或刪除操作的線性數據結構。關鍵特性&#xff1a; 雙端操作&am…

GNU到底是什么,與Unix和Linux是什么關系

GNU&#xff08;發音為 /ɡnu?/&#xff0c;類似“革奴”&#xff09;是一個自由軟件操作系統項目&#xff0c;由理查德斯托曼&#xff08;Richard Stallman&#xff09;于1983年發起&#xff0c;目標是創建一個完全由自由軟件組成的類Unix操作系統。它的名字是一個遞歸縮寫&a…

雙指針算法介紹及使用(下)

在上一篇文章中我們已經對雙指針有了一定了解&#xff0c;接下來我們通過題目來對雙指針進行更好的理解。 1. leetcode 202. 快樂數 這道題使用的方法是快慢指針&#xff0c; 比如說一個數X&#xff0c;那么創建兩個變量X1和X2&#xff0c;然后X1每次變化兩次&#xff0c;X2變化…

Elasticsearch整合:Repository+RestClient雙模式查詢優化

Elasticsearch整合&#xff1a;RepositoryRestClient雙模式查詢優化Elasticsearch 雙模式查詢優化&#xff1a;Repository RestClient 整合指南一、架構設計&#xff1a;雙模式協同工作流二、Repository 模式&#xff1a;快速開發最佳實踐2.1 基礎配置2.2 高級特性&#xff1a…

Elasticsearch 高級查詢語法 Query DSL 實戰指南

目錄 1、DSL 概述 1.1 DSL按照查詢的結構層次劃分 1.2 DSL按照檢索功能的用途和特性劃分 1.3 示例數據準備 2、match_all ——匹配所有文檔 3、精確匹配 3.1 term——單字段精確匹配查詢 3.2 terms——多值精確匹配 3.3 range——范圍查詢 3.4 exists——是否存在查詢…

DNS 服務正反向解析與 Web 集成實戰:從配置到驗證全流程

DNS 服務正反向解析配置全流程指南 一、前言 在網絡環境中&#xff0c;DNS&#xff08;Domain Name System&#xff09;服務起著至關重要的作用&#xff0c;它負責將域名解析為 IP 地址&#xff0c;以及將 IP 地址反向解析為域名。本文將詳細介紹如何配置 DNS 服務的正反向解析…

2025.07.25【宏基因組】|PathoScope 安裝與使用指南

PathoScope 安裝與使用指南&#xff1a;微生物組數據分析利器 作為一名生物信息工程師&#xff0c;在微生物組數據分析中&#xff0c;我們常常需要高效、準確的工具來鑒定和量化樣本中的微生物組成。PathoScope 正是這樣一款強大的工具&#xff0c;它能夠幫助我們從高通量測序…

AI結對編程:分布式團隊的集體記憶外腦

AI結對編程:分布式團隊的集體記憶外腦 “當新人通過AI瞬間掌握三年積累的業務規則時,傳統‘傳幫帶’模式正式宣告過時——分布式團隊最珍貴的資產不再是代碼,而是被AI固化的集體經驗。” 一、人腦的帶寬困局 柏林新人加入新加坡支付團隊,面臨恐怖的知識迷宮: - …

棧----1.有效的括號

20. 有效的括號 - 力扣&#xff08;LeetCode&#xff09; /** 括號特性: 左括號必定先出現,每個左括號都需要一個右括號與之匹配,后出現的左括號先匹配 解法: 依據后出現的左括號先匹配,很容易聯想到棧,即后進先出 遍歷字符串,遇到左括號就在棧中添加一個對應的右括號 遇到右括…

數據報表怎么自動填寫內容?總結了幾個方法

你有沒有遇到過這種情況&#xff1f;月底趕銷售報告&#xff0c;Excel里密密麻麻的數據要往Word里搬&#xff0c;光是復制粘貼就折騰半小時&#xff0c;好不容易搞完&#xff0c;老板突然說數據有更新…得&#xff0c;全白干&#xff01;更崩潰的是&#xff0c;這種重復勞動每個…

構造函數是否可以聲明成虛函數?

構造函數&#xff08;constructor&#xff09;不能被聲明為虛函數。? 原因解釋 構造函數的主要職責是創建并初始化對象本身&#xff0c;而虛函數機制是基于 虛表指針&#xff08;vptr&#xff09; 的&#xff0c;它只有在對象構造完成之后才會起作用。 所以&#xff1a; 在構造…

【Rust線程池】如何構建Rust線程池、Rayon線程池用法詳細解析

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

CAN總線網絡的參數協同:從一致性要求到容差邊界

CAN總線網絡的參數協同&#xff1a;從一致性要求到容差邊界 一、引言&#xff1a;CAN總線的“隱形契約”二、CAN通信的核心參數&#xff1a;不止于波特率三、參數一致性的必要性&#xff1a;為何波特率相同仍會失敗&#xff1f;四、容差范圍的科學界定&#xff1a;從理論計算到…

Activity 啟動模式

如何指定 Activity 的啟動模式&#xff1f;在 AndroidMainfest.xml 中通過給 <activity> 標簽指定 android:lauchMode 來選擇啟動模式。4種啟動模式standard&#xff08;默認&#xff09;&#xff1a;每當啟動一個 Activity&#xff0c;都會創建一個新的實例壓入返回棧。…

7·22勝算云AI日報:OpenAI再擴容且與英國政府簽訂三年AI計劃、字節GR-3、微軟Culture計劃、國數局數據基地

OpenAI Oracle&#xff1a;4.5 GW「Stargate II」再擴容&#xff0c;AI 電力版圖重排 7 月 22 日&#xff0c;OpenAI 與 Oracle 聯合公布“Stargate II”計劃&#xff1a;雙方將在美國多地追加 4.5 GW 超算級電力與冷卻配套&#xff0c;使 Stargate 系列園區總規模躍升至 5 GW…

【優選算法】鏈表

目錄鏈表常用的技巧和操作1、常用技巧2、常用操作一、[兩數相加](https://leetcode.cn/problems/add-two-numbers/description/)二、[兩兩交換鏈表中的節點](https://leetcode.cn/problems/swap-nodes-in-pairs/description/)三、[重排鏈表](https://leetcode.cn/problems/reor…

制造業新突破:AR 培訓系統助力復雜操作輕松上手?

在制造業&#xff0c;生產設備復雜、操作流程繁瑣&#xff0c;新員工掌握操作技能不易。比如汽車制造企業的發動機裝配環節&#xff0c;涉及眾多精密零部件安裝&#xff0c;對安裝順序、位置精度要求嚴格&#xff0c;一點小失誤都可能影響發動機性能甚至引發質量問題。過去新員…

《計算機網絡》實驗報告八 加密、數字簽名與證書

目 錄 1、實驗目的 2、實驗環境 3、實驗內容 3.1 對稱加密 3.2 散列函數 3.3 非對稱加密 3.4 數字簽名 3.5 證書 4、實驗結果與分析 4.1 對稱加密 4.2 散列函數 4.3 非對稱加密 4.4 數字簽名 4.5 證書 5、實驗小結 5.1 問題與解決辦法&#xff1a; 5.2 心得體…

MySQL(157)如何分析和優化存儲過程?

分析和優化存儲過程是數據庫性能優化的重要環節。通過對存儲過程進行分析和優化&#xff0c;可以提高數據庫操作的執行效率&#xff0c;減少資源消耗&#xff0c;改善系統整體性能。以下是詳細的步驟和代碼示例&#xff0c;介紹如何分析和優化 MySQL 存儲過程。 一、分析存儲過…

基于深度學習的胸部 X 光圖像肺炎分類系統(一)

本文先重點介紹了過采樣的原理是實現。 由于醫學數據相對缺乏&#xff0c;過采樣是解決數據問題的方法之一。 后續寫一篇搭建神經網絡的說明 目錄 概述 導入必要的庫 數據加載和預處理函數 處理樣本不均衡函數 構建改進的 CNN 模型函數 主函數 數據生成器generator&…