跳转至

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

问题描述#

你正在玩一个单人游戏,面前放置着大小分别为 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
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution:
    def maximumScore(self, a: int, b: int, c: int) -> int:
        ans = 0

        while True:
            a, b, c = sorted([a, b, c])
            if a == 0 and b == 0:
                break
            b -= 1
            c -= 1
            ans += 1

        return ans
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution {
public:
    int maximumScore(int a, int b, int c) {
        vector<int> A{a, b, c};
        int ans = 0;

        while (true) {
            sort(A.begin(), A.end());
            if (!A[0] && !A[1]) break;
            --A[1], --A[2], ++ans;
        } 

        return ans;
    }
};

方法二:数学推导#

最小的一堆肯定最先消耗完,然后再看剩下的两堆中的最小值越大越好。

假设 \(a\le b\le c\),然后题目的意思就是把 \(a\) 分配到 \(b,c\) 两堆后能够得到的最大值。

如果 \(a+b\lt c\),则是 \(a+b\)

否则是 \(c + (a - (c - b)) / 2=(a+b+c)/2\)

1
2
3
4
class Solution:
    def maximumScore(self, a: int, b: int, c: int) -> int:
        tot = a + b + c
        return min(tot // 2, tot - max(a, b, c))
1
2
3
4
5
6
7
class Solution {
public:
    int maximumScore(int a, int b, int c) {
        int tot = a + b + c;
        return min(tot / 2, tot - max({a, b, c}));
    }
};
返回顶部

在手机上阅读