有一个可以无限重生的 Boss,开始时 Boss 有 1 点生命值,当 Boss 被击败后(血量小于等于 0 时),玩家可以获得 1 点积分,此后 Boss 会复活并且血量翻倍 (第一次复活是 2,第二次是 4,第三次是 8,依次类推,复活之后 Boss 满血),再次击败 Boss 后可以再次获得 1 点积分。 Boss 不会行动,初始时玩家攻击力为 1,玩家可以行动 n 个回合,对于每一个回合玩家可以选择下面三种操作的一个。 操作 1:攻击 对 Boss 攻击,Boss 降低的血量等于玩家的当前攻击力 操作 2:攻击强化 攻击力永久 × 2 操作 3:蓄力 下次攻击时,攻击力 × 8,可以叠加(两次蓄力后可以 × 64, 但是攻击之后增益消失),只对第一次攻击有收益 示例:执行 5 次操作,分别为 22311,那么第一次的攻击时攻击力是 32,第二次的攻击时攻击力是 4

题目要求我们在有限的回合内,选择合适的操作来最大化获得积分的数量。

首先,我们可以观察到,每次击败 Boss 并获得积分后,Boss 的血量都会翻倍。这意味着,我们可以通过不断地击败 Boss 来获得更多的积分。因此,我们的策略应该是尽可能多地击败 Boss。

其次,我们可以注意到,蓄力操作只对第一次攻击有收益。因此,我们应该在蓄力之前尽可能多地进行攻击操作,以增加我们的攻击力。

基于以上观察,我们可以制定以下策略:

  1. 首先,我们将尽可能多地进行攻击操作,直到我们的攻击力达到 8。
  2. 接下来,我们进行蓄力操作,将攻击力增加到最大值。
  3. 之后,我们尽可能多地进行攻击操作,直到我们的回合用完或者 Boss 的血量降低到 0 以下。
  4. 如果我们的回合还没有用完,并且 Boss 的血量降低到 0 以下,我们将继续重复步骤 1-3,直到我们的回合用完。

根据以上策略,我们可以用代码来模拟游戏过程,并计算出最终获得的积分数量。

def get_max_score(n, actions):
    score = 0   # 初始积分为 0
    boss_hp = 1 # 初始 Boss 血量为 1
    attack = 1  # 初始攻击力为 1
    charge = 0  # 蓄力次数
    for action in actions:
        if action == 1:  # 攻击操作
            boss_hp -= attack  # 减少 Boss 血量
            if boss_hp <= 0:   # 如果 Boss 被击败
                score += 1     # 获得 1 点积分
                boss_hp = 2**charge  # Boss 复活,血量翻倍
        elif action == 2:  # 攻击强化操作
            attack *= 2     # 攻击力翻倍
        elif action == 3:  # 蓄力操作
            charge += 1     # 蓄力次数加 1
            attack = 8      # 攻击力设为 8
    return score

n = int(input())       # 输入回合数
actions = list(map(int, input().split()))  # 输入操作序列
max_score = get_max_score(n, actions)       # 计算最大积分数量
print(max_score)

以上代码中,我们使用一个循环来遍历操作序列,并根据不同的操作进行相应的处理。在每个操作结束后,我们检查 Boss 的血量是否降低到 0 以下,如果是,则增加积分并重置 Boss 的血量为 2 的蓄力次数次方。最后,我们返回最终的积分数量。

该算法的时间复杂度为 O(n),其中 n 为回合数。


原文地址: https://www.cveoy.top/t/topic/p87n 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录