小红杀怪【牛客tracker & 每日一题】

小红杀怪

时间限制:1秒 空间限制:256M

网页链接

牛客tracker

牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!
在这里插入图片描述

题目描述

小红在一个游戏里杀怪。这是个回合制游戏,小红和两只怪物相遇了。
第一只怪物有 a a a 血量,第二只怪物有 b b b 血量。
小红有两个技能:
第一个技能叫火球术,效果是对单体怪物造成 x x x 伤害。
第二个技能叫烈焰风暴,效果是对每只怪物造成 y y y 伤害。
小红想知道,自己最少使用多少次技能,可以击杀这两只怪物?(当怪物血量小于等于 0 0 0 时,视为被击杀)

输入描述:

四个正整数 a , b , x , y a,b,x,y a,b,x,y,用空格隔开。
1 ≤ a , b , x , y ≤ 20 1≤a,b,x,y≤20 1a,b,x,y20

输出描述:

小红使用技能的最少次数。

示例1

输入:

5 2 3 1

输出:

3

摘要总结

题目描述小红在回合制游戏中需击杀两只血量分别为 a a a b b b 的怪物,拥有火球术(单体伤害 x x x)和烈焰风暴(群体伤害 y y y)两个技能。目标是计算最少技能使用次数。解题时首先比较两种技能的总伤害效率,若火球术更优且怪物血量均高于 y y y,则分别计算火球术次数;否则先用烈焰风暴攻击至较弱怪物死亡,再用火球术补刀剩余血量。代码通过条件判断和向上取整计算最优解,时间复杂度 O ( 1 ) O(1) O(1)。示例输入 5 5 5 2 2 2 3 3 3 1 1 1 输出 3 3 3,验证了算法正确性。

解题思路

先判断烈焰风暴对两只怪的总伤害 ( 2 y ) (2y) 2y 是否小于火球术单体伤害 x x x,且两只怪物血量均大于 y y y,若是则分别计算用火球术击杀每只怪物的次数(血量除以 x x x 向上取整)并累加,即为最少次数;否则先取两只怪物血量的最小值,计算用烈焰风暴击杀该怪物所需次数(血量除以 y y y 向上取整),用该次数的烈焰风暴攻击后,扣除血量最大值对应伤害,若剩余血量大于 0 0 0 则计算补充火球术的次数(剩余血量除以 x x x 向上取整),总次数为烈焰风暴次数加火球术补充次数,以此得到击杀两只怪物的最少技能使用次数。

代码内容

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll N=2e5+10;

int main()
{
    ll a,b,x,y;
    cin>>a>>b>>x>>y;

    ll sum=0;
    if(y*2<x&&(a>y&&b>y))
    {
        sum+=(a%x==0)?(a/x):a/x+1;
        sum+=(b%x==0)?(b/x):b/x+1;
    }
    else
    {
        ll c=min(a,b),d=max(a,b);
        sum+=(c%y==0)?(c/y):c/y+1;
        d-=sum*y;
        if(d>0) sum+=(d%x==0)?(d/x):d/x+1;
    }

    cout<<sum<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pretty Boy Fox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值