经此一役小红所向无敌
时间限制:1 秒
空间限制:256M
网页链接
牛客tracker
牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!
题目描述
经过重重困难,对立和光终于来到魔王城,和最终的大魔王——小红进行决战。
- 已知小红的血量是10 9999999999 10^{9999999999}109999999999。
- 对立的攻击力是a aa,血量是h hh。
- 光的攻击力是b bb,血量是k kk。
每回合光先对小红发起攻击,然后对立对小红发起攻击,然后小红展开幻术,令光和对立同时互相攻击。
每次攻击后,受击者的血量会减掉攻击者的攻击力。
当光和对立其中一人死亡后,另一人会悲痛欲绝,对小红发出自己攻击力× 10 \times 10×10的伤害的大招,然后自杀。
(若两人同时死亡,则两人都无法发出大招)
小红想知道,弱小的光和对立,她们能对自己造成多少点伤害?
输入描述
一行4 44个正整数a , h , b , k a, h, b, ka,h,b,k,用空格隔开。
1 ≤ a , b , h , k ≤ 10 9 1 \le a, b, h, k \le 10^91≤a,b,h,k≤109
输出描述
一个正整数,代表小红受到的伤害。
示例 1
输入:
2 3 1 3输出:
26说明:第一回合,小红受到了对立和光的攻击,并让她们互相攻击。第一回合结束时,小红共受到3 33点伤害。这时对立血量为2 22,光的血量为1 11。
说明的后半段在截图中被页面截断,按题面规则推演完整过程如下:
- 第1 11回合:小红受到a + b = 3 a + b = 3a+b=3伤害;对立掉b = 1 b = 1b=1血(3 → 2 3 \to 23→2),光掉a = 2 a = 2a=2血(3 → 1 3 \to 13→1)。
- 第2 22回合:小红再受3 33伤害;对立掉1 11血(2 → 1 2 \to 12→1),光掉2 22血(1 → − 1 1 \to -11→−1),光死亡。
- 光死后,对立悲痛欲绝,对小红发出a × 10 = 20 a \times 10 = 20a×10=20的大招后自杀。
- 总伤害= 3 + 3 + 20 = 26 = 3 + 3 + 20 = 26=3+3+20=26。
数据范围与提示
- 1 ≤ a , b , h , k ≤ 10 9 1 \le a, b, h, k \le 10^91≤a,b,h,k≤109
- 小红血量视为无穷大,因此只需统计光与对立对小红造成的总伤害,不必担心小红死亡。
- 核心思路(纯模拟 + 数学计算):
- 每回合开始,小红固定受到a + b a + ba+b点伤害(光打b bb、对立打a aa);
- 回合末的互相攻击中,对立掉b bb血、光掉a aa血。于是
- 光死亡所需回合数t a = ⌈ k a ⌉ t_a = \left\lceil \dfrac{k}{a} \right\rceilta=⌈ak⌉;
- 对立死亡所需回合数t h = ⌈ h b ⌉ t_h = \left\lceil \dfrac{h}{b} \right\rceilth=⌈bh⌉。
- 记t = min ( t a , t h ) t = \min(t_a, t_h)t=min(ta,th),则基础伤害为( a + b ) × t (a + b) \times t(a+b)×t。
- 大招判断:
- 若t a < t h t_a < t_hta<th(光先死),则对立发出大招,额外伤害10 a 10a10a;
- 若t h < t a t_h < t_ath<ta(对立先死),则光发出大招,额外伤害10 b 10b10b;
- 若t a = t h t_a = t_hta=th(同回合双双阵亡),无人能发出大招。
- 答案为( a + b ) × t + (可能的大招伤害) (a+b) \times t + \text{(可能的大招伤害)}(a+b)×t+(可能的大招伤害)。数值最大约为10 10 10^{10}1010量级,请使用 64 位整数(
long long)。时间复杂度O ( 1 ) O(1)O(1)。
解题思路
解题思路
本题是纯模拟 + 数学计算的简单题。小红血量视为无穷大,只需统计光和对立对小红造成的总伤害。每回合固定流程:光先攻击小红(伤害b bb),对立再攻击小红(伤害a aa),然后两人互相攻击(光掉a aa血,对立掉b bb血)。当其中一人死亡后,另一人会发出攻击力× 10 \times 10×10的大招并自杀。若同回合双双死亡,则无人放大招。
1. 问题等价转化
- 每回合固定伤害:无论后续如何,每完整进行一回合,小红都会受到a + b a + ba+b点伤害。
- 死亡回合数:
- 光死亡所需回合数:t a = ⌈ k a ⌉ t_a = \left\lceil \dfrac{k}{a} \right\rceilta=⌈ak⌉(因为每回合光掉a aa血)。
- 对立死亡所需回合数:t h = ⌈ h b ⌉ t_h = \left\lceil \dfrac{h}{b} \right\rceilth=⌈bh⌉(每回合对立掉b bb血)。
- 总回合数:取两者较小值t = min ( t a , t h ) t = \min(t_a, t_h)t=min(ta,th)。在这t tt个回合中,小红都会受到a + b a+ba+b伤害,基础伤害为( a + b ) × t (a+b) \times t(a+b)×t。
- 大招判断:
- 若t a < t h t_a < t_hta<th,说明光先死,对立存活,对立会发出大招,额外伤害10 a 10a10a。
- 若t h < t a t_h < t_ath<ta,说明对立先死,光存活,光会发出大招,额外伤害10 b 10b10b。
- 若t a = t h t_a = t_hta=th,同回合双双阵亡,无人放大招,无额外伤害。
2. 算法实现
- 读入四个正整数a , h , b , k a, h, b, ka,h,b,k。
- 计算t a = ⌈ k / a ⌉ = ( k + a − 1 ) / a t_a = \lceil k/a \rceil = (k + a - 1) / ata=⌈k/a⌉=(k+a−1)/a。
- 计算t h = ⌈ h / b ⌉ = ( h + b − 1 ) / b t_h = \lceil h/b \rceil = (h + b - 1) / bth=⌈h/b⌉=(h+b−1)/b。
- 取t = min ( t a , t h ) t = \min(t_a, t_h)t=min(ta,th)。
- 初始化总伤害
ans = (a + b) * t。 - 若t a < t h t_a < t_hta<th,则
ans += 10 * a;若t h < t a t_h < t_ath<ta,则ans += 10 * b。 - 输出
ans。
3. 复杂度分析
- 时间复杂度:仅进行常数次算术运算,O ( 1 ) O(1)O(1)。
- 空间复杂度:O ( 1 ) O(1)O(1),仅使用几个变量。
- 数据范围:所有输入≤ 10 9 \le 10^9≤109,伤害值最大约10 10 10^{10}1010量级,使用
long long即可。
总结
通过分析每回合的固定伤害和死亡所需回合数,直接计算出基础伤害,再根据谁先死亡判断是否额外受到大招伤害。逻辑清晰,计算简单,无需模拟每一回合。
代码内容
#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;ll a,h,b,k;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>a>>h>>b>>k;ll rd=min((h+b-1)/b,(k+a-1)/a);boolf1=(rd==(h+b-1)/b);boolf2=(rd==(k+a-1)/a);ll ans=0;ans+=(a+b)*rd;if(!f1)ans+=a*10;if(!f2)ans+=b*10;cout<<ans<<endl;return0;}