OpenJudge NOI 1.5 37:僱傭兵
阿新 • • 發佈:2021-01-15
【題目連結】
【題目考點】
1. 模擬
2. < cmath >中的取整函式
- 向上取整函式
double ceil(double x)
,返回大於等於x的最小整數。 - 向下取整函式
double floor(double x)
,返回小於等於x的最大整數。 - 注意:兩函式返回的返回值都是double型別的
【解題思路】
- 補血階段:需要補M點血,每個能量元素最多補戰鬥力N點血,那麼補血消耗能量元素個數為: ⌈ M / N ⌉ \lceil M / N \rceil ⌈M/N⌉
- 戰鬥階段:設當前戰鬥力為n。在這個戰鬥週期共有M天,連續戰鬥n天,戰鬥力上升1點,這一戰鬥週期戰鬥力可以上升
⌊
M
/
n
⌋
\lfloor M / n \rfloor
- 迴圈進行補血階段、戰鬥階段,直到補血階段將能量元素耗盡,無法補滿血為止
【題解程式碼】
解法1:使用取整函式ceil, floor
#include <bits/stdc++.h>
using namespace std;
int main()
{
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;
return 0;
}
解法2:用迴圈來模擬補血和戰鬥階段
#include <bits/stdc++.h>
using namespace std;
int main()
{
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;
return 0;
}