C/C++编程学习 - 第9周 ⑨ 雇佣兵

题目链接

题目描述

雇佣兵的体力最大值为 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;
}
上一篇:Bug记录---npm install时报错:无法加载文件 C:\Users\hp\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本


下一篇:Java复习_static静态方法(类方法)