题目描述
雇佣兵的体力最大值为 M,初始体力值为 0、战斗力为 N、拥有 X 个能量元素。
当雇佣兵的体力值恰好为 M 时,才可以参加一个为期 M 天的战斗期,战斗期结束体力值将为 0。在同一个战斗期内,雇佣兵每连续战斗 n 天,战斗力就会上升 1 点,n 为当前战斗期开始时的战斗力。
一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值 M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。
请问:雇佣兵的战斗力最大可以到达多少。
说明:只在战斗期结束后可以使用能量元素,可以使用多个能量元素。
输入格式
一行包括三个整数 M、N、X,相邻两个整数之间用单个空格隔开。M、N、X 均为不超过 10000 的正整数。
输出格式
输出一个整数,为雇佣兵的最大战斗力。
Sample Input
5 2 10
Sample Output
6
思路
贪心的思想,模拟补充体力和战斗的过程。当每一个元素所补充的体力为最大的时候,最后所有战斗结束的时候的战斗力最大。
C++代码1:
#include<iostream>
using namespace std;
int m, n, x, hp, cnt;//hp记录当前的体力值
int main()
{
cin >> m >> n >> x;
while(x > 0 && hp < m)//初始化体力为0,因此需要补充体力
{
x--;
hp += n;
if(hp > m) hp = m;
}
while(x >= 0)//模拟能够进行的所有战斗的过程
{
if(hp == m)//模拟m场战斗,同时更新战斗力
{
hp = 0;
n += m / n;
}
else break;
while(x > 0 && hp < m)//模拟一场战斗结束后,用元素进行补充体力的过程
{
x--;
hp += n;
if(hp > m) hp = m;
}
}
cout << n << '\n';//输出最后的战斗结束后的最大战斗力
return 0;
}
C++代码2:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int M, N, X;
while(cin >> M >> N >> X)
{
int m = 0, n = N;
while(X > 0)
{
X--;
m += n;
if(m >= M)
{
n += M / n;
m = 0;
}
}
cout << n << endl;
}
return 0;
}