一、打怪
题目解析
我们现在要去刷毛球怪,我的攻击和血量是
h和a、毛球怪的攻击和血量是H和A;我们和毛球怪的对决是轮流攻击 (我们先手),当血量小于等于
0时死亡;现在我们要求在自己存活的条件下,最多能够杀死几只毛球怪;最后输出这个数量。
注意:如果能够杀死无数只怪物,就输出 -1
算法思路
对于这道题,首先我们想到的可能就是模拟整个打怪过程,然后记录杀死怪物的数量。
而对于模拟整个过程,程序运行的时间也太长了;而且如果我们能够杀死无数只怪物,那我们要一直模拟整个过程;那也太麻烦了。
有没有更加简单的方法?
这道题我们每一个怪物的血量和攻击都是固定的,那我们能不能求出来我们杀死一只怪物所受到的伤害,在根据我们自身的血量,不就可以直接计算出我们能够杀死多少只怪物吗?
所以我们的思路就是先求出来我们杀死一只怪物要攻击多少次,再求出自己所受到的伤害,最后直接计算出能够杀死怪物的数量。
计算杀死一只怪要攻击多少次:m = H/a + (H%a == 0?0:1);
我们要受到多少次攻击:n = m-1;(我们先手,所以我们受到攻击的次数比我们攻击的次数少一)
我们杀死一只怪要受到的伤害:r = n*A;(我们受到的伤害就等于受到攻击的次数 * 怪物的攻击)
能杀死怪物的最多数量:ret = h%r==0?(h/r-1):h/r;
题目的前提是我们要存活下来,如果 h%r==0,那在面对第 h/r 这只怪物时,我们的生命值是先减到 0 的,所以我们杀不死这一只怪,杀怪的数量就等于 h/r -1;如果 h%r != 0,那就说明杀死第 h/r 只怪以后我们还是存活的,那杀怪的数量就是 h/r。
最后我们来处理一下能够杀死无数只怪的问题
如果能够杀死无数只怪,那就说明我们杀死一只怪是没有掉生命值的;
那只有我们能够一次攻击杀死怪物才会无伤打怪,那也就是说我们的攻击 a 要大于等于怪物的生命 H 的。
所以当 a>=H 时,输出 -1 即可。
代码实现
#include <iostream>
using namespace std;
int h, a, H, A;
int fun(){
if(H <= a) return -1;
int n = H/a + (H%a == 0 ? 0 : 1); // 几次攻击能杀死一只怪
int m = n - 1; // 杀死一只怪要受到几次怪物的攻击
r = m * A;
ret = h % r == ? h / r - : h / r;
ret;
}
{
t; cin >> t;
(t--){
cin >> h >> a >> H >> A;
cout << () << endl;
}
;
}


