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
广告