Python程序:查找移除石子后的最大得分


假设我们有三个值 a、b 和 c。我们正在玩一个单人纸牌游戏,有三堆石子,其大小分别为 a、b 和 c。每回合,玩家选择两堆不同的非空石子堆,从每堆中取走一块石子,并将 1 分添加到他的得分中。当剩余的非空石子堆少于两堆时,游戏结束。因此,我们必须找到您可以获得的最大得分。

因此,如果输入类似于 a = 4、b = 4、c = 6,则输出将为 7,因为初始状态为 (4, 4, 6),然后我们可以按照以下步骤进行:

  • 从第 1 堆和第 2 堆中选择,因此当前状态为 (3, 3, 6)

  • 从第 1 堆和第 3 堆中选择,因此当前状态为 (2, 3, 5)

  • 从第 1 堆和第 3 堆中选择,因此当前状态为 (1, 3, 4)

  • 从第 1 堆和第 3 堆中选择,因此当前状态为 (0, 3, 3)

  • 从第 2 堆和第 3 堆中选择,因此当前状态为 (0, 2, 2)

  • 从第 2 堆和第 3 堆中选择,因此当前状态为 (0, 1, 1)

  • 从第 2 堆和第 3 堆中选择,因此当前状态为 (0, 0, 0)

最后,非空石子堆少于两堆,因此游戏结束。

为了解决这个问题,我们将遵循以下步骤:

  • minimum := a、b 和 c 的最小值

  • maximum := a、b 和 c 的最大值

  • left := a + b + c - maximum - minimum

  • 如果 maximum-left <= minimum,则

    • 返回 minimum + left - (1 + minimum - (maximum-left))/2 的商

  • 返回 minimum + (maximum-minimum 和 left 的最小值)

示例

让我们看看以下实现以获得更好的理解:

def solve(a, b, c):
   minimum = min(a,b,c)
   maximum = max(a,b,c)
   left = a+b+c-maximum-minimum
   if maximum-left<=minimum:
      return minimum + left-(1+minimum-(maximum-left))//2
   return minimum + min(maximum-minimum,left)

a = 4
b = 4
c = 6
print(solve(a, b, c))

输入

4, 4, 6

输出

7

更新于: 2021年10月6日

340 次浏览

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告