🐎要打一个血量为 的史莱姆,每回合他可以攻击一次,造成 点伤害。当一个史莱姆的血量小于等于 时,就会死亡。 如果一个史莱姆受到攻击后,当前血量小于等于最大血量的一半,且没有死亡,就会分裂成两个史莱姆,它们的当前血量和最大血量都等于分裂前的血量。 假设史莱姆不会攻击,只会挨打,求🐎打掉所有史莱姆需要的回合数。
时间: 2023-05-26 15:03:13 浏览: 186
假设打掉一个史莱姆需要 x 回合,则可以列出如下递推式:
x = ceil(HP/ATK) + (HP/2 > ATK ? x : x+1)
其中 ceil 表示向上取整操作。第一项代表🐎直接攻击将史莱姆打死的回合数,第二项表示如果史莱姆分裂,则需要多一回合的时间将分裂出的另一个史莱姆也打死。
假设初始只有一个史莱姆,其最大血量为 HP0,则打掉所有史莱姆需要的总回合数为:
x_total = x1 + x2 + ... + xn
其中 xi 表示打死第 i 个史莱姆需要的回合数。每个史莱姆分裂都会增加一个史莱姆,因此只需要考虑每个史莱姆分裂后的情况即可。
例如,第一个史莱姆分裂后会变成两个史莱姆,每个史莱姆的最大血量都是 HP0,因此 xi = ceil(HP0/ATK) + 1。
第二个史莱姆和其他史莱姆一样也会分裂,假设它之前已经被攻击过一次,那么它的当前血量就是 HP0/2,最大血量还是 HP0。根据递推式,打死这个史莱姆需要的回合数为:
x2 = ceil(HP0/ATK) + (HP0/4 > ATK ? x1 : x1+1)
其中的 HP0/4 表示当前血量小于等于最大血量的一半。
以此类推,可以得到打掉所有史莱姆需要的总回合数。
相关问题
Description WW大佬一出门就遇到了一只普通史莱姆,他开始疯狂释放他的技能,已知他有Q、W、E、R、S五个技能,和总共释放技能的次数n。 Q:造成65*Q的释放次数(包括E复制的Q); W:如果上一个技能造成伤害大于等于250,就造成上次伤害50%的伤害,反之造成10%的伤害; E:重复上一个技能; R:造成上一个技能两倍的伤害,并使下一个技能伤害额外增加50%(最后结算) S:增加两次技能使用次数; 所有伤害数值向下取整。 Input 第一行输入一个整数n代表释放的技能数; 第二行有至少n个单字符表示所释放的技能,每两个字符间用空格隔开 输入保证第一个不为'E' Output 输出独占一行 输出最终造成的总伤害
根据你提供的问题描述,我理解到WW大佬释放技能的规则以及需要计算总伤害。下面是一个用C++编写的程序,可以计算出WW大佬最终造成的总伤害。
```cpp
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main() {
int n;
cin >> n;
string last_skill = ""; // 上一个技能
int last_damage = 0; // 上一个技能的伤害
int extra_damage = 0; // 下一个技能的额外伤害
int total_damage = 0; // 总伤害
for (int i = 0; i < n; i++) {
string current_skill;
cin >> current_skill;
if (current_skill == "Q") {
int q_damage = 65 * (i + 1); // 伤害 = 65 * Q的释放次数
if (last_skill == "R") {
q_damage = floor(1.5 * q_damage); // R技能加成
}
total_damage += q_damage;
last_damage = q_damage;
}
else if (current_skill == "W") {
int w_damage;
if (last_damage >= 250) {
w_damage = floor(0.5 * last_damage); // 上一个技能伤害的50%
}
else {
w_damage = floor(0.1 * last_damage); // 上一个技能伤害的10%
}
if (last_skill == "R") {
w_damage = floor(1.5 * w_damage); // R技能加成
}
total_damage += w_damage;
last_damage = w_damage;
}
else if (current_skill == "E") {
if (last_skill == "") {
continue; // 如果没有上一个技能,则忽略E技能
}
last_damage = last_damage; // E技能重复上一个技能的伤害
}
else if (current_skill == "R") {
if (last_skill == "") {
continue; // 如果没有上一个技能,则忽略R技能
}
int r_damage = last_damage * 2; // 伤害 = 上一个技能伤害的两倍
if (last_skill == "R") {
r_damage = floor(1.5 * r_damage); // R技能加成
}
total_damage += r_damage;
last_damage = r_damage;
}
else if (current_skill == "S") {
n += 2; // 增加两次技能使用次数
}
last_skill = current_skill; // 更新上一个技能
}
cout << total_damage;
return 0;
}
```
使用这段代码,你可以输入技能释放的顺序和次数,然后程序将计算出WW大佬最终造成的总伤害并输出。
希望这个解决方案对你有帮助!如果还有其他问题,请随时提问。
WW大佬一出门就遇到了一只普通史莱姆,他开始疯狂释放他的技能,已知他有Q、W、E、R、S五个技能,和总共释放技能的次数n。 Q:造成65*Q的释放次数(包括E复制的Q); W:如果上一个技能造成伤害大于等于250,就造成上次伤害50%的伤害,反之造成10%的伤害; E:重复上一个技能; R:造成上一个技能两倍的伤害,并使下一个技能伤害额外增加50%(最后结算) S:增加两次技能使用次数; 所有伤害数值向下取整
根据你的描述,WW大佬遇到了一只普通史莱姆,并开始释放他的技能。现在我们来计算他的总伤害。
假设他总共释放了n次技能。
首先,我们需要初始化一些变量:
total_damage = 0 # 总伤害
last_damage = 0 # 上一个技能的伤害
extra_damage = 0 # 下一个技能的额外伤害
然后,我们循环n次来模拟技能释放:
for i in range(n):
total_damage += last_damage # 累计上一个技能的伤害
# 检查上一个技能是否满足W技能的条件
if last_damage >= 250:
last_damage *= 0.5
else:
last_damage *= 0.1
# 处理E技能的情况,将上一个技能的伤害赋值给last_damage
if i > 0:
last_damage = last_damage
# 处理R技能的情况,将下一个技能的额外伤害增加50%
extra_damage = last_damage * 2 * 0.5
# 总伤害增加下一个技能的额外伤害
total_damage += extra_damage
# 处理S技能的情况,增加两次技能使用次数
n += 2
最后,我们可以输出WW大佬的总伤害:
print("WW大佬的总伤害为:", total_damage)
请注意,这只是一个简化的模型,并没有考虑技能的释放顺序和其他可能的细节。
阅读全文