1753. 移除石子的最大得分

Posted 易小顺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1753. 移除石子的最大得分相关的知识,希望对你有一定的参考价值。

算法记录

LeetCode 题目:

  你正在玩一个单人游戏,面前放置着大小分别为 a​​​​​​、b 和 c​​​​​​ 的 三堆 石子。
  每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。
  给你三个整数 a 、b 和 c ,返回可以得到的 最大分数



说明

一、题目

输入: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 分 。

二、分析

  • 首先明确该题目的意思是需要每次从两堆中取出各一个,也就是里面的个数会各减一。
  • 大家都知道短板效益,这道题也需要从最少的石堆进行入手,通过最小的去带动大的。
  • 题意只要两个堆为 0 了,整个游戏就结束了,也就是说我们可先处理掉一个堆,另外两个堆取最少的就可以了。
  • 我们可以模拟两种情况:一是最小堆加上次小堆比最大的堆要少,也就是说最小堆和最大堆同时开始减,最后的数量还是比两外一个要多,这时候直接最小加上次小即可。二是最小堆加上次小堆比最大的堆要多,可以先将两个大堆进行补齐,在同时经过最小堆来进行下降操作,最后在加上次小堆即可。
class Solution {
    public int maximumScore(int a, int b, int c) {
        int temp = 0;
        int ans = 0;
        if(a > b) {
            temp = a;
            a = b;
            b = temp;
        }
        if(b > c) {
            temp = c;
            c = b;
            b = temp;
            if(a > b) {
                temp = a;
                a = b;
                b = temp;
            }
        }
        ans = Math.min(a, c - b);
        a -= ans;
        c -= ans;
        if(a > 1) {
            c -= a / 2;
            b -= a / 2;
            ans += a - a % 2;
        }
        ans += b;
        return ans;
    }
}

总结

理解题目的意思找出规律,容易犯的是直接进行数量上的加减。

以上是关于1753. 移除石子的最大得分的主要内容,如果未能解决你的问题,请参考以下文章

1753. 移除石子的最大得分

LeetCode﹝堆ி﹞移除石子的最大得分,吃苹果的最大数目等

石子合并问题

石子合并问题

石子合并问题

石子合并问题