二分+贪心 打怪兽

120 阅读1分钟

题目

459ff61e102782953cb16a40c18afd65.png

  • 因为伤害最少为1,所以回合数最少为1回合,最长为hp+1回合,所以从 [1,hp+1]范围进行二分,当二分的节点不能杀死怪兽时,则往右边区域进行二分,否则一直往左,直到越界
  • 当二分确定回合后,只需要判断能否在指定回合内杀死怪兽就行,此时每一轮进行贪心,比较砍一刀的伤害高还是中毒的伤害累加到回合结束的伤害高
function process(cuts, poisons, hp) {
  // 最短回合
  let left = 1,
    // 最长回合
    right = hp + 1;
  let middle = 0,
    ans = Infinity;

  while (left <= right) {
    middle = left + (right - left) / 2;
    // 如果能够杀死怪兽
    if (find(cuts, poisons, hp, middle)) {
      ans = middle;
      right = right - 1;
    } else {
      // 或者不能
      left = left + 1;
    }
  }

  function find(cuts, poisons, hp, middle) {
    let len = Math.min(cuts.length, middle);
    for (let i = 0, j = 1; i < len; i++, j++) {
      // 每次选砍一刀和中毒造成的所有回合累加伤害最高的一个
      hp -= Math.max(cuts[i], (middle - j) * [poisons[i]]);
      if (hp <= 0) {
        return true;
      }
    }
    return false;
  }
}