解题思路:
- 最直接的想法:每次移除石子的时候都判断一下三堆石子那两堆较大,从较大的两堆中各移除一个,如果有两个石子堆的数量==0,则循环退出,输出循环次数即可
- 贪心+数学推导:假设a<=b<=c,那么题目可以分解为两种情况:
- a+b>c,此时只需要将a和b分别与c消除,最后a与b都为0,c还剩余石子,次数为a+b
- 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花了([]为向下取整),所以两次一共花费
次。
代码:
法一:(这里为了方便每次直接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