魔导师晨拥 题解

题目描述

魔导师晨拥是炉石传说中的一张传说卡牌,其英雄技能机制如下:

  • 初始伤害:2点
  • 技能机制:如果恰好击杀一个随从(伤害等于血量),伤害永久+1
  • 战斗咆哮:对所有敌人造成伤害(从左到右攻击随从,最后攻击英雄)
  • 重要观察:血量降到负数后继续减少不会对答案造成影响,因为只有恰好击杀(血量归零)才会增加伤害

给定 个敌方随从的血量 次战斗咆哮,求对敌方英雄造成的总伤害。

核心结论

答案: 模拟每次战斗咆哮,维护当前伤害值,统计对英雄的总伤害。

关键观察: 每次战斗咆哮后,如果随从恰好被击杀,伤害值会增加,影响后续攻击。

标程实现

#include <iostream>
using namespace std;

int a[202020];

int main() {
    int n, m, i, j;
    cin >> n >> m;
    int res = 0;
    
    // 读入随从血量
    for (i = 0; i < n; i++) {
        cin >> a[i];
    }
    
    int dmg = 2;  // 初始伤害
    
    // 模拟m次战斗咆哮
    for (i = 0; i < m; i++) {
        // 从左到右攻击随从
        for (j = 0; j < n; j++) {
            a[j] -= dmg;
            if (a[j] == 0) dmg++;  // 恰好击杀,伤害+1
        }
        res += dmg;  // 对英雄造成伤害
    }
    
    cout << res;
}

算法解释

核心思想

模拟每次战斗咆哮的过程:

  1. 按顺序攻击每个随从
  2. 如果随从恰好被击杀(血量归零),伤害值+1
  3. 最后攻击英雄,累计伤害

算法步骤

  1. 初始化:伤害值设为 ,总伤害为
  2. 模拟战斗咆哮
    • 遍历所有随从,造成当前伤害
    • 检查是否恰好击杀,如果是则伤害+1
    • 攻击英雄,累计总伤害
  3. 输出结果:总伤害

关键技巧

  • 状态维护:维护当前伤害值和随从血量
  • 恰好击杀判断a[j] == 0 表示恰好击杀
  • 伤害累加:每次战斗咆哮后都要攻击英雄
  • 负数血量处理:血量变为负数后继续减少不会影响伤害值,因为只有恰好击杀才会增加伤害。所以这里并不需要特判。

复杂度分析

  • 时间复杂度: ,其中 是战斗咆哮次数, 是随从数量
  • 空间复杂度:

优化思考

对于更大的数据范围(如 ),当前算法会超时。可能的优化方向:

  1. 数学公式推导:寻找伤害增长的数学规律
  2. 分阶段处理:将随从死亡过程分为不同阶段
  3. 批量计算:利用伤害值的单调性进行批量处理

但考虑到本题的数据范围较小,暴力模拟已经足够高效。