[路飞]_leetcode刷题_1753. 移除石子的最大得分

112 阅读2分钟

题目

1753. 移除石子的最大得分

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

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

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

  示例 1:

输入:a = 2, b = 4, c = 6
输出:6
解释:石子起始状态是 (2, 4, 6) ,最优的一组操作是:
- 从第一和第三堆取,石子状态现在是 (1, 4, 5)
- 从第一和第三堆取,石子状态现在是 (0, 4, 4)
- 从第二和第三堆取,石子状态现在是 (0, 3, 3)
- 从第二和第三堆取,石子状态现在是 (0, 2, 2)
- 从第二和第三堆取,石子状态现在是 (0, 1, 1)
- 从第二和第三堆取,石子状态现在是 (0, 0, 0)
总分:6 分 。

示例 2:

输入:a = 4, b = 4, c = 6
输出:7
解释:石子起始状态是 (4, 4, 6) ,最优的一组操作是:
- 从第一和第二堆取,石子状态现在是 (3, 3, 6)
- 从第一和第三堆取,石子状态现在是 (2, 3, 5)
- 从第一和第三堆取,石子状态现在是 (1, 3, 4)
- 从第一和第三堆取,石子状态现在是 (0, 3, 3)
- 从第二和第三堆取,石子状态现在是 (0, 2, 2)
- 从第二和第三堆取,石子状态现在是 (0, 1, 1)
- 从第二和第三堆取,石子状态现在是 (0, 0, 0)
总分:7 分 。

示例 3:

输入:a = 1, b = 8, c = 8
输出:8
解释:最优的一组操作是连续从第二和第三堆取 8 回合,直到将它们取空。
注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。

思路:

先将a,b,c排序,然后这题要分两种情况讨论

  1. 如果a+b<=c,这种情况最优解肯定是a和b分别去和c消耗,最后算总数,即a+b
  2. 如果a+b>c,这种情况,就是需要a和b先内部消耗,消耗到刚好满足a+b<=c即可。这里可以算出应该内部消耗的次数为 Math.ceil((a+b-c)/2),向上取整

代码如下:

var maximumScore = function(a, b, c) {
        let arr = [a,b,c];
        for(let i=0;i<arr.length-1;i++){
            for(let j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    [arr[j], arr[j+1]] =  [arr[j+1], arr[j]]
                }
            }
        }
        if (arr[0] + arr[1] <= arr[2]){
            return arr[0] + arr[1]
        }
        let off = Math.ceil((arr[0] + arr[1] - arr[2]) / 2)
        return off + (arr[0]-off + arr[1]-off)
};