1. 程式人生 > 其它 >OpenJudge NOI 1.5 37:僱傭兵

OpenJudge NOI 1.5 37:僱傭兵

技術標籤:OpenJudge NOI題解C++基礎c++

【題目連結】

OpenJudge NOI 1.5 37:僱傭兵

【題目考點】

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
    M/n
    點。
  • 迴圈進行補血階段、戰鬥階段,直到補血階段將能量元素耗盡,無法補滿血為止

【題解程式碼】

解法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; }