Python程式:計算競賽中可獲得的積分
假設我們參加一個程式設計競賽,其中有多個問題,但當我們解決一個問題時,競賽就結束。現在,如果我們有兩個相同長度的數字列表,分別稱為 points 和 chances。為了解釋它,對於第 i 個問題,我們有 chances[i] 的機率以 points[i] 的分數解決它。我們還有一個值 k,表示我們可以嘗試的問題數量。同一個問題不能嘗試兩次。
如果我們設計一個最優策略,我們將不得不找到在競賽中可以獲得的分數的期望值,四捨五入到最接近的整數。我們可以預期嘗試第 i 個問題的價值為 points[i] * chances[i] / 100.0,這表示我們平均會獲得的分數。
因此,如果輸入類似於 points= [600, 400, 1000],chances = [10, 90, 5],k = 2,則輸出將為 392。
為了解決這個問題,我們將遵循以下步驟:
n := points 的大小
對於 i 從 0 到 n,執行:
chances[i] := chances[i] / 100.0
R := 將 0-3 按照 points 降序排列
返回 int(dp(0, K))
定義一個函式 dp()。它將接收 i 和 k 作為引數
如果 i 等於 n,則
返回 0.0
j := R[i]
p := chances[j]
ev := p * points[j]
如果 k 等於 1,則
返回 ev 和 dp(i + 1, k) 的最大值
返回 dp(i + 1, k - 1) *(1 - p) + ev 和 dp(i + 1, k) 的最大值
示例
讓我們看看以下實現以獲得更好的理解:
class Solution: def solve(self, points, chances, K): n = len(points) for i in range(n): chances[i] /= 100.0 R = sorted(range(n), key=points.__getitem__, reverse=True) def dp(i, k): if i == n: return 0.0 j = R[i] p = chances[j] ev = p * points[j] if k == 1: return max(ev, dp(i + 1, k)) return max(dp(i + 1, k - 1) * (1 - p) + ev, dp(i + 1, k)) return int(dp(0, K)) ob = Solution() print (ob.solve([600, 400, 1000], [10, 90, 5], 2))
輸入
[600, 400, 1000], [10, 90, 5], 2
輸出
392
廣告