魔导师晨拥 题解
题目描述
魔导师晨拥是炉石传说中的一张传说卡牌,其英雄技能机制如下:
- 初始伤害: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
- 最后攻击英雄,累计伤害
算法步骤
- 初始化:伤害值设为
,总伤害为
- 模拟战斗咆哮:
- 遍历所有随从,造成当前伤害
- 检查是否恰好击杀,如果是则伤害+1
- 攻击英雄,累计总伤害
- 输出结果:总伤害
关键技巧
- 状态维护:维护当前伤害值和随从血量
- 恰好击杀判断:
a[j] == 0
表示恰好击杀 - 伤害累加:每次战斗咆哮后都要攻击英雄
- 负数血量处理:血量变为负数后继续减少不会影响伤害值,因为只有恰好击杀才会增加伤害。所以这里并不需要特判。
复杂度分析
- 时间复杂度:
,其中
是战斗咆哮次数,
是随从数量
- 空间复杂度:
优化思考
对于更大的数据范围(如 ),当前算法会超时。可能的优化方向:
- 数学公式推导:寻找伤害增长的数学规律
- 分阶段处理:将随从死亡过程分为不同阶段
- 批量计算:利用伤害值的单调性进行批量处理
但考虑到本题的数据范围较小,暴力模拟已经足够高效。