雇佣兵--找好循环的终止条件-问题集中在这里进行处理思考

//雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。
//
//当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。
//
//一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。
//
//请问:雇佣兵的战斗力最大可以到达多少。
//
//输入
//一行包括三个整数M、N、X,相邻两个整数之间用单个空格隔开。M、N、X均为不超过10000的正整数。
//输出
//输出一个整数,为雇佣兵的最大战斗力。
//样例输入
//5 2 10
//样例输出
//6

#include <iostream>
using namespace std;

int main()
{   int m,n,x;
    scanf("%d%d%d",&m,&n,&x);
    while(x>0)
    {
        int t = m / n;        //t为单个战斗期增加战斗力的数取整 
        if(m%n!=0)            //其实就是如果上面的式子不是正好整数,对应这里的余数如果不等于0,则单个战斗期不会刚好战斗力整数增加后结束, 
            t++;            //需要跨越其他战斗期才能增长后续战斗力。所以这里+1 
                            //上面的代码是确定战斗力增加值 
            
        if(x<t)             // 如果这一次循环战斗力增加值超过了能量个数所能提供的体力恢复,结束循环 
            break;
            
        x-=t;                  //注意这里的先后顺序, 如果循环没有结束,上本次循环消耗掉t个能量 
        t = m / n;       //这里是t是因为本战斗期能够增加的战斗力只能是m/n 。加上下面的战斗期数才是t+1 
        n += t;         //本次循环结束战斗力增加值 
    }
    printf("%d",n);
    return 0;
}
 

猜你喜欢

转载自blog.csdn.net/LVT18171910/article/details/81411013