题目描述
你正在玩一个单人游戏,面前放置着大小分别为 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
}