补血阶段:需要补M点血,每个能量元素最多补战斗力N点血,那么补血消耗能量元素个数为:
⌈
M
/
N
⌉
\lceil M / N \rceil
⌈M/N⌉
战斗阶段:设当前战斗力为n。在这个战斗周期共有M天,连续战斗n天,战斗力上升1点,这一战斗周期战斗力可以上升
⌊
M
/
n
⌋
\lfloor M / n \rfloor
⌊M/n⌋点。
循环进行补血阶段、战斗阶段,直到补血阶段将能量元素耗尽,无法补满血为止
【题解代码】
解法1:使用取整函数ceil, floor
#include<bits/stdc++.h>usingnamespace std;intmain(){int m, hp =0, n, x;//hp: 体力值
cin>>m>>n>>x;while(true){
x -=(int)ceil((double)m / n);//把体力值从0补到m,消耗能量元素if(x <0)break;
n +=(int)floor((double)m / n);//这周期战斗力增加 }
cout<<n;return0;}
解法2:用循环来模拟补血和战斗阶段
#include<bits/stdc++.h>usingnamespace std;intmain(){int m, hp =0, n, x, nAdd;//hp: 体力值
cin>>m>>n>>x;while(true){for(hp =0; hp < m; hp += n)//补血到hp>=m时结束
x--;//每次用一个能量水晶,补n点血。n是当前战斗力 if(x <0)break;
nAdd =0;//本轮能增加几点战斗力 for(int i =1; i <= m;++i)//m天战斗 {if(i % n ==0)//i是n整数倍的天数时,已经连续战斗n天,那么本轮战斗增加的点数加1
nAdd++;}
n += nAdd;//增加战斗点}
cout<<n;return0;}