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;
    }
}

总结

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值