一日一练:移除石子的最大得分

109 阅读1分钟

你正在玩一个单人游戏,面前放置着大小分别为 a​​​​​​、b 和 c​​​​​​ 的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1 分。当存在 两个或更多 的空堆时,游戏停止。给你三个整数 a 、b 和 c ,返回可以得到的 最大分数 。

为了得到最大分数,每次都从三堆中拿出数量较大的两堆石子。可以使用最大堆。每次取出较大的两堆,减1之后判断是否为0,不为0继续加入堆中;继续下一次取最大两堆。。。

最大堆的实现专栏前几篇文字已介绍。

除最大堆外的代码:

var maximumScore = function(a, b, c) {
  const bh = new MaxBinaryHeap([a, b ,c])
  let count = 0
  while(bh.length > 1) {
      let l1 =  bh.pop()
      let l2 =  bh.pop()
      if (--l1 > 0) {
          bh.insert(l1)
      }
      if (--l2 > 0) {
          bh.insert(l2)
      }
      count++
  }
  return count
};