【问题描述】
雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。
当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。 一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。
请问:雇佣兵的战斗力最大可以到达多少。
输入:一行包括三个整数M、N、X,相邻两个整数之间用单个空格隔开。M、N、X均为不超过10000的正整数。
输出:输出一个整数,为雇佣兵的最大战斗力。
#include <iostream>
using namespace std;
int main(){
int M,N,X,S=0; //M:最大体力值, N:战斗力, X:能量, S:初始体力
cin>>M>>N>>X;
while (X){ //X>0
X--; //每使用一个能量
S=S+N; //体力值+1
if (S>=M){
S=M; //体力值恰好为M,参加M天的战斗
while (S){
if(S%N==0) //连续战斗N天,战斗力上升1点
N++;
S--; //能量值-1
}
}
}
cout<<N<<endl;
}
// if简写-if后只有一条语句: if (条件) 语句; 可不加:和{}
分析:
1.M:最大体力值,N:战斗力,X:能量元素,S:初始体力值;
2.每个能量元素可恢复的体力值不超过当前战斗力
每个能量可补充体力最少1个,最多N个
3.发现问题:当M=5,N=2,X=10时,如果1个能量元素均恢复最大战斗力,那么3个能量元素就可以达到6的体力(超出最大体力);实际的解决方法是:第1个能量元素恢复2,第2个能量元素恢复2,第3个能量元素恢复1战斗力
if(S>=M){
S=M;
……
}
(此方法较容易理解,如您有其他解法,欢迎分享)