[路飞] 55——leetcode - 1753. 移除石子的最大得分

122 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1753. 移除石子的最大得分

题目分析

你正在玩一个单人游戏,面前放置着大小分别为 abc 的 三堆 石子。

每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。

给你三个整数 abc ,返回可以得到的 最大分数

思路讲解

  • 首先对三个值进行排序,按着从小到大的排序方便我们以后取值。
  • 首先干掉第一堆里面,第三根堆比第二堆长的数量。
  • 接着判断第一堆里面是否为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