题目
- 因为伤害最少为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;
}
}