小红杀怪
时间限制: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
1≤a,b,x,y≤20
输出描述:
小红使用技能的最少次数。
示例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;
}
1669

被折叠的 条评论
为什么被折叠?



