链接:https://ac.nowcoder.com/acm/contest/5026/A
来源:牛客网
题目描述
你是一个勇士,现在你准备去森林刷毛球怪,你有两个属性(血量,攻击力),毛球怪也有这两个属性。当你遭遇一只毛球怪时你们会进入战斗,然后你和毛球怪轮流攻击(你先手),每次使对方的血量减去自己攻击力的数值,当一方的血量小于等于 0 时死亡。现在你想知道在自己活着的前提下最多杀死几只毛球怪。
输入描述:
第一行一个正整数t,代表测试数据组数。
第二行四个正整数h,a,H,A,代表你的血量和攻击力以及毛球怪的血量和攻击力。
所有整数大小不超过1000。
输出描述:
共 t 行,每行一个整数x,代表最多能杀死多少毛球怪。如果能杀死无数只,输出-1。
示例1
输入
1
5 1 2 1
输出
4
题解
这题是第一题,没有什么算法,好好的分析就行了。
有以下几种情况
1.勇士给怪物一刀, H -= a <= 0, 怪物直接毙命,上第二个怪物的时候,仍然是勇士先动手,所以勇士可以杀无穷只。
2 勇士给怪物一刀, H -=a > 0 ,怪物没死,反过来攻击勇士
2.a h - =A > 0 , 勇士没死,再攻击怪物…反复下去直到勇士死,最后勇士死的时候一定是勇士砍怪物一刀,怪物再攻击勇士致死。
2.b h - =A < =0 , 勇士死了,杀0只。
具体实现
1 先定义几个变量含义,h,a,H , A,如题;
这个时候对于情况2,假设勇士杀死了n只怪物,首先计算杀死每只怪物时,勇士受到的伤害 e
每杀一只怪物,一定是勇士打先手,最后结尾,则
e = ( H - 1 ) / a*A
/ /例如 H = 2, a = 1 ,A=1;
勇士先手 怪物血量H = H - 1 = 1
怪物攻击
勇士攻击 怪物血量H = H - 1 = 0 怪物死亡,给勇士造成1次伤害为1
可以多带几个例子进去试试 ,
/ /
2 之后再思考勇士被杀死时 ,一定是在勇士杀第n+1只怪物时,被反杀
假设攻击第n+1只怪物时,勇士受到的伤害为t
则一定有 A <= t <= e ,且A>=1,所以1 <= t <= e
//大于等于A是因为一定受到了攻击 , 等于e是在没有挺过最后一击的时候被杀死,如果挺过去就可以杀掉怪物。
所以有
n*e + t = h ( 1 <= t <= e )
这个时候仔细思考一下可以得出
n=(h-1)/e ("/"此时为整除)
// 这个解释起来可能有点麻烦,理解不了的话,我在下面写了解方程,h-1是为了是防止在t=e的情况下 ,求出来的n比实际大1,因为t=e时,勇士没有杀死怪物。
解方程 n=(h-t)/e ("/“此时不是整除符号符号)
由于t >=1,且n是整数,则
n=(h-1)/e (”/"此时为整除)
代码(c++)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t,h,a,H,A,e;
cin>>t;
while(t--)
{
cin>>h>>a>>H>>A;
e=(H-1)/a*A;
if(e)
cout<<(h-1)/e<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
写的很乱,有不理解的地方可以评论