🐎要打一个血量为 的史莱姆,每回合他可以攻击一次,造成 点伤害。当一个史莱姆的血量小于等于 时,就会死亡。 如果一个史莱姆受到攻击后,当前血量小于等于最大血量的一半,且没有死亡,就会分裂成两个史莱姆,它们的当前血量和最大血量都等于分裂前的血量。 假设史莱姆不会攻击,只会挨打,求🐎打掉所有史莱姆需要的回合数。(用C++写)
时间: 2023-05-26 11:03:08 浏览: 212
#include<stdio.h>
int main()
{
int hp, dam; //血量和攻击伤害
scanf("%d%d", &hp, &dam);
int cnt = 0; //打掉的史莱姆数量
while(hp > 0)
{
if(hp <= dam) //当前史莱姆血量小于等于伤害,直接打死
{
cnt++;
break;
}
else if(hp <= hp/2*2) //当前史莱姆血量小于等于最大血量的一半
{
cnt += 2; //打掉两个史莱姆
hp = hp/2; //史莱姆分裂,血量减半
}
else //血量大于最大血量的一半,打死一个史莱姆
{
cnt++;
hp -= dam;
}
}
printf("%d", cnt);
return 0;
}
相关问题
🐎要打一个血量为 的史莱姆,每回合他可以攻击一次,造成 点伤害。当一个史莱姆的血量小于等于 时,就会死亡。 如果一个史莱姆受到攻击后,当前血量小于等于最大血量的一半,且没有死亡,就会分裂成两个史莱姆,它们的当前血量和最大血量都等于分裂前的血量。 假设史莱姆不会攻击,只会挨打,求🐎打掉所有史莱姆需要的回合数。
假设打掉一个史莱姆需要 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大佬最终造成的总伤害并输出。
希望这个解决方案对你有帮助!如果还有其他问题,请随时提问。
阅读全文