[路飞]移除石子最大得分

141 阅读1分钟

题目描述

你正在玩一个单人游戏,面前放置着大小分别为 a​​​​​​、b 和 c​​​​​​ 的 三堆 石子。

每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。

给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。

解题思路

让参数有序

首先,为了方便后续操作,我们让参数交换,让 a < b < c

如何取出能保证最大

让最长的两堆 b, c 都减到 0,能得到最多值!

首先,我们取最长的 c 和最短的 a,让 c 尽可能和 b 相等,这边需要注意的是,如果穷尽 b 也办不到,那么两堆就减去 c - b, 得分是 Math.min(c - b, a)

然后对于剩余的 a,如果 a 为奇数,我们首先要让他 -1 变为偶数, 我们让他分别和 b, c 扣除,因此每堆减的是 a / 2,这一步得分为 a

最后,b 是最后一步的得分

代码

/**
 * @param {number} a
 * @param {number} b
 * @param {number} c
 * @return {number}
 */
var maximumScore = function (a, b, c) {
  if (a > b) return maximumScore(b, a, c)
  if (b > c) return maximumScore(a, c, b)
  if (a > b) return maximumScore(b, a, c)

  let ans = 0

  // step1
  const cnt1 = Math.min(c - b, a)

  c -= cnt1
  a -= cnt1
  ans += cnt1

  // step2
  if (a !== 0) {
    a = a % 2 === 0 ? a : a - 1

    c -= a / 2
    b -= a / 2
    ans += a
  }

  // step3
  ans += b

  return ans
}