「每日LeetCode」2022年12月21日

本文最后更新于:2023年3月19日 晚上

1753.移除石子的最大得分

1753.移除石子的最大得分

Category Difficulty Likes Dislikes
algorithms Medium (63.28%) 41 -

Tags
Companies
你正在玩一个单人游戏,面前放置着大小分别为 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

Discussion | Solution

思路

代码的第一部分声明了一个变量 res,并将其初始化为 0。然后,它创建了一个数组 arr,其中包含了参数 a、b 和 c 的值。接下来,它对数组进行排序,使得数组中的元素从大到小排列。
然后,代码进入了一个无限循环,只有当数组 arr 的第二个元素为 0 且第三个元素为 0 时,才会终止循环。在每次循环中,数组 arr 的第一个元素减去 1,第二个元素减去 1,然后对数组进行排序,使得数组中的元素从大到小排列。最后,变量 res 的值加 1。
最后,函数返回变量 res 的值。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
* @lc app=leetcode.cn id=1753 lang=javascript
*
* [1753] 移除石子的最大得分
*/

// @lc code=start
/**
* @param {number} a
* @param {number} b
* @param {number} c
* @return {number}
*/
var maximumScore = function (a, b, c) {
let res = 0;
const arr = [a, b, c].sort((a, b) => +b - +a);
while (arr[1] !== 0 || arr[2] !== 0) {
arr[0] = arr[0] - 1;
arr[1] = arr[1] - 1;
arr.sort((a, b) => +b - +a);
res++;
}
return res;
};
// @lc code=end