牛客练习赛61 打怪 题解

链接: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;
}

写的很乱,有不理解的地方可以评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值