LeetCode[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 回合,直到将它们取空。

注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。


提示:

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

Related Topics

  • 贪心

  • 数学

  • 堆(优先队列)


重点!!!解题思路

第一步:

明确解题手段
此题并没有那么复杂,用数学知识即可

第二步:

如何确保玩的最多次
每次我们从a堆和c-b堆的长度中截取,首先消除a堆
消除完a堆后,b和c堆再一起慢慢消除
这样我们才能确保玩的次数最多

第三步:

所以分别判断a>c-b、a=c-b、a<c-b之后玩的次数
a<c-b和a=c-b,肯定是a堆玩没了,接着b堆也玩没了,总次数为a+b次
a>c-b为第一次a堆剩余a-(c-b)长度,b和c堆长度相等,先玩c-b次
之后我们将a砍一半跟b,c堆消除
所以总次数为c-b+a-c+b+b-(a-c+b)/2最后消除完的等式为(a+b+c)/2

源码:

class Solution {
    public int maximumScore(int a, int b, int c) {
        //首先排序a,b和c的顺序
        if (a>b) {
            int temp=a;
            a=b;
            b=temp;
        }
        if (a>c){
            int temp=a;
            a=c;
            c=temp;
        }
        if (b>c){
            int temp=b;
            b=c;
            c=temp;
        }
        if (a<=c-b) return a+b;
        return (a+b+c)/2;
    }
}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮被咬碎成星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值