Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目分析
你正在玩一个单人游戏,面前放置着大小分别为 a
、b
和 c
的 三堆 石子。
每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1
分。当存在 两个或更多 的空堆时,游戏停止。
给你三个整数 a
、b
和 c
,返回可以得到的 最大分数 。
思路讲解
- 首先对三个值进行排序,按着从小到大的排序方便我们以后取值。
- 首先干掉第一堆里面,第三根堆比第二堆长的数量。
- 接着判断第一堆里面是否为0,否就是第二堆和第三堆的数量是一样的,分别消掉第一堆里面的二分之一个部分,此时第一堆被削掉了,然后不断地减去第二堆和第三堆的数量。
- 最后返回轮数。
示例
示例 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 分 。
示例 3:
输入:a = 1, b = 8, c = 8
输出:8
解释:最优的一组操作是连续从第二和第三堆取 8 回合,直到将它们取空。
注意,由于第二和第三堆已经空了,游戏结束,不能继续从第一堆中取石子。
代码
/*
* @lc app=leetcode.cn id=1753 lang=javascript
*
* [1753] 移除石子的最大得分
*/
// @lc code=start
/**
* @param {number} a
* @param {number} b
* @param {number} c
* @return {number}
* 进行abc的排序,保证 小、 中、 大,干掉第一堆里面,第三堆比第二堆多的数量
* 判断第一堆里面是否为0, 不为0就表示第二堆和第三堆的数量是一样的
* 分别消掉第一堆的二分之一个数量,第二堆和第三堆都要减去相等的二分之一的a
* 接着不断的减去第二堆和第三堆的数量
*/
var maximumScore = function (a, b, c) {
// 1. 排序
if (a > b) [a, b] = [b, a]
if (a > c) [a, c] = [c, a]
if (b > c) [b, c] = [c, b]
var ans = 0 // 得分数
var cnt1 = Math.min(c - b, a)
a -= cnt1
c -= cnt1
ans += cnt1
// 2. 把a消没
if (a != 0) {
if (a % 2 == 1) a -= 1
b -= a / 2 | 0
c -= a / 2 | 0
ans += a
}
// 3. b跟c是一样的值
ans += b
return ans
};
// @lc code=end