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

解题思路:

  • 最直接的想法:每次移除石子的时候都判断一下三堆石子那两堆较大,从较大的两堆中各移除一个,如果有两个石子堆的数量==0,则循环退出,输出循环次数即可
  • 贪心+数学推导:假设a<=b<=c,那么题目可以分解为两种情况:
  1. a+b>c,此时只需要将a和b分别与c消除,最后a与b都为0,c还剩余石子,次数为a+b
  2. a+b<c,此时a和b依旧与c消除,但在消除过程中保持a和b的数量,即最后a和b的数量相等或者相差一,此时c的数量为0,剩余的只需不断将a和b想消并不断模拟,即可得出答案

公式推导(第二种情况):假设a与c消了k1次,b与c消了k2次,c = k1 + k2,消c共花了c次,剩余消a、b花了[\frac{(a-k1)+(b-k2)}{2}]([]为向下取整),所以两次一共花费[\frac{a+b+c}{2}]次。

 代码:

法一:(这里为了方便每次直接sort()了,所以代码的时间复杂度很高,也可以写个函数或者在每次while中判断一下他们的大小)

class Solution:
    def maximumScore(self, a: int, b: int, c: int) -> int:
        temp = [a, b, c]
        temp.sort()
        cnt = 0
        while temp[1] != 0:
            cnt += 1
            temp[1] -= 1
            temp[2] -= 1
            temp.sort()
        return cnt

法二:

class Solution:
    def maximumScore(self, a: int, b: int, c: int) -> int:
        v = [a, b, c]
        v.sort()
        if v[0] + v[1] < v[2]:
            return v[0] + v[1]
        return (v[0] + v[1] + v[2]) // 2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值