LeetCode 1753. 移除石子的最大得分

Posted Tisfy

tags:

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

【LetMeFly】1753.移除石子的最大得分

力扣题目链接:https://leetcode.cn/problems/maximum-score-from-removing-stones/

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

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

给你三个整数 abc ,返回可以得到的 最大分数

 

示例 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 回合,直到将它们取空。
注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。

 

提示:

  • 1 <= a, b, c <= 105

方法一:贪心

贪心的思路较容易想到,就是在游戏没有结束的时候,每次选取石头数量最多的两个石堆进行移除操作。

数据量是 1 0 5 10^5 105级别,可以很快计算出结果。

方法二:贪心 + 数学

有没有在方法一的基础上,更快地计算出结果的方法呢?

不失一般性,我们将石头堆排个序,令 a ≤ b ≤ c a\\leq b\\leq c abc

1. 假设c足够大

那么我们将在消耗完 a a a和消耗完 b b b后, c c c堆剩余 c − a − b c-a-b cab颗石头。尽管我们每次操作都从 c c c中移除石头,但是 c c c的石头数量太多了,到最后也没用完。因此我们得到了最大分数 a + b a+b a+b

此时有 a + b < c a+b<c a+b<c

2. 假设c没有那么大

也就是说 a + b ≥ c a+b\\geq c a+bc的时候,我们每次仍然从数量最大的两个石头堆中取石头,那么最终的结果要么是 0 , 0 , 0 0, 0, 0 0,0,0,要么是 0 , 0 , 1 0, 0, 1 0,0,1(或 001 001 001的其他顺序)。

这是因为:

  • 首先, c c c石头最多(排序后),并且 c c c不足以消耗完 a b ab ab后仍有剩余( a + b ≥ c a+b\\geq c a+bc),那么就不可能出现 0 , 0 , 100 0, 0, 100 0,0,100的情况
  • 其次,假设能出现 0 , 1 , 1 0, 1, 1 0,1,1的情况,那么我们就能从两个 1 1 1中各取一石,这样就变成了 0 , 0 , 0 0, 0, 0 0,0,0

综上,假如 a + b ≥ c a+b\\geq c a+bc,那么最终至多剩下一颗石头,也就是说消耗了 a + b + c a+b+c a+b+c a + b + c − 1 a+b+c-1 a+b+c1颗石头,得到的分数为 ⌊ a + b + c 2 ⌋ \\lfloor\\fraca+b+c2\\rfloor 2a+b+c

1和2总结

首先对三个石头堆排序使得 a < b < c a<b<c a<b<c

  • a + b < c a+b<c a+b<c,则得分 a + b a+b a+b

  • 否则得分 ⌊ a + b + c 2 ⌋ \\lfloor\\fraca+b+c2\\rfloor 2a+b+c

  • 时间复杂度 O ( 1 ) O(1) O(1),三个数的排序时空消耗可以忽略不计

  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
public:
    int maximumScore(int a, int b, int c) 
        int v[3] = a, b, c;
        sort(v, v + 3);
        if (v[0] + v[1] < v[2])
            return v[0] + v[1];
        return (v[0] + v[1] + v[2]) / 2;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/128403163

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

1753. 移除石子的最大得分

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

Leetcode 5379. 石子游戏 III(第183场周赛)

石子合并问题

石子合并问题

石子合并问题