当前位置: 面试刷题>> 吹气球 (经典算法题500道)


题目描述补充

题目:吹气球

在一个派对上,有N个小朋友,每个小朋友手中都有一个气球。现在,他们按照某种顺序轮流吹气球,每次吹气球的体积都会翻倍(假设初始体积为1单位)。但是,当气球的体积超过M单位时,气球就会爆炸。派对有一个规则,一旦某个小朋友的气球爆炸,他就不能继续吹气球了,并且顺序会移动到下一个小朋友。派对的目标是尽可能多地吹气球(即让尽可能多的气球达到最大体积而不爆炸),同时记录哪个小朋友吹爆了最多气球。

输入

  1. N(整数):小朋友的数量。
  2. M(整数):气球爆炸的阈值。

输出

  1. 最多能吹多少个气球而不爆炸(即所有气球的最大总体积,每个气球不超过M单位)。
  2. 吹爆最多气球的小朋友的数量(如果有多个小朋友吹爆的气球数量相同,则输出任意一个)。

示例代码

PHP 示例

<?php
function blowBalloons($N, $M) {
    $maxBalloons = 0; // 最多能吹多少个气球而不爆炸
    $maxExploded = 0; // 吹爆最多气球的小朋友数量
    $explodedCount = array_fill(0, $N, 0); // 每个小朋友吹爆的气球数量

    for ($i = 0; $i < $N; $i++) {
        $volume = 1; // 初始体积
        $blows = 0; // 当前小朋友吹气球的次数

        while ($volume <= $M) {
            $volume *= 2; // 体积翻倍
            $blows++; // 吹气球次数增加
        }

        // 如果气球爆炸,则更新相关计数
        if ($volume > $M) {
            $explodedCount[$i]++;
            $maxExploded = max($maxExploded, $explodedCount[$i]);
        }

        $maxBalloons += $blows - 1; // 减去最后一次导致爆炸的吹气
    }

    return [$maxBalloons, $maxExploded];
}

// 示例
$N = 3;
$M = 6;
list($maxBalloons, $maxExploded) = blowBalloons($N, $M);
echo "最多能吹 $maxBalloons 个气球而不爆炸。\n";
echo "吹爆最多气球的小朋友数量是 $maxExploded。\n";
?>

Python 示例

def blowBalloons(N, M):
    max_balloons = 0
    max_exploded = 0
    exploded_count = [0] * N

    for i in range(N):
        volume = 1
        blows = 0

        while volume <= M:
            volume *= 2
            blows += 1

        if volume > M:
            exploded_count[i] += 1
            max_exploded = max(max_exploded, exploded_count[i])

        max_balloons += blows - 1

    return max_balloons, max_exploded

# 示例
N = 3
M = 6
max_balloons, max_exploded = blowBalloons(N, M)
print(f"最多能吹 {max_balloons} 个气球而不爆炸。")
print(f"吹爆最多气球的小朋友数量是 {max_exploded}。")

JavaScript 示例

function blowBalloons(N, M) {
    let maxBalloons = 0;
    let maxExploded = 0;
    let explodedCount = new Array(N).fill(0);

    for (let i = 0; i < N; i++) {
        let volume = 1;
        let blows = 0;

        while (volume <= M) {
            volume *= 2;
            blows++;
        }

        if (volume > M) {
            explodedCount[i]++;
            maxExploded = Math.max(maxExploded, explodedCount[i]);
        }

        maxBalloons += blows - 1;
    }

    return [maxBalloons, maxExploded];
}

// 示例
const N = 3;
const M = 6;
const [maxBalloons, maxExploded] = blowBalloons(N, M);
console.log(`最多能吹 ${maxBalloons} 个气球而不爆炸。`);
console.log(`吹爆最多气球的小朋友数量是 ${maxExploded}。`);

注意: 上述代码假设气球在体积翻倍后立即检查是否超过阈值M,并在超过时停止计数。如果气球在达到M单位体积的精确瞬间不爆炸,而是需要超过M才爆炸,则逻辑需要相应调整。此外,题目描述中的“尽可能多地吹气球”可能需要根据实际场景进一步解释,这里假设是最大化所有气球在爆炸前的总吹气次数。

推荐面试题