私信TA

用户名:dotcpp0784625

访问量:722

签 名:

等  级
排  名 2243
经  验 2390
参赛次数 0
文章发表 19
年  龄 20
在职情况 学生
学  校 北京理工大学
专  业 弹药工程与爆炸技术

  自我简介:

解题思路:

题目:

雇佣兵的体力最大值为M,初始体力值为0、战斗力为N、拥有X个能量元素。

当雇佣兵的体力值恰好为M时,才可以参加一个为期M天的战斗期,战斗期结束体力值将为0。在同一个战斗期内,雇佣兵每连续战斗n天,战斗力就会上升1点,n为当前战斗期开始时的战斗力。

一个战斗期结束后,雇佣兵需要用若干个能量元素使其体力恢复到最大值M,从而参加下一个战斗期。每个能量元素恢复的体力值不超过当前的战斗力。每个能量元素只能使用一次。

请问:雇佣兵的战斗力最大可以到达多少。


通过读题可得,输入量有三个,分别为M,N,X,刚开始的时候体力值为0,需要消耗能量元素使体力值达到M,然后参加N天的战斗,增加M/N的战斗力,然后维持类似的循环路径,直到能量元素消耗完之后不能再恢复体力值,便会达到最大战斗力。首先每次战斗之前要恢复体力值,每个能量元素能恢复的最大体力值为N,也就是战斗力大小,所以如果M / N为整数的话,每次消耗的能量元素便为M / N个;如果M / N不为整数的话,每次消耗的个数便为M / N + 1个。其次,每次战斗之后,战斗力都会提高,连续战斗n天战斗力提高一点,所以每次提高的战斗力便为M / N,所以每次循环之后,N = N + M / N;当X < 0的时候跳出循环,输出N即可。

注意事项:

题目较长,需要有耐心认真理解题目各个量之间的联系,找出循环条件

参考代码:

#include<stdio.h>


int main()

{

    int M = 0;

    int N = 0;

    int X = 0;

    int ret = 0;


    scanf("%d %d %d", &M, &N, &X);//输入M,N,X的值


    while (X)

    {

        //判断每次消耗的能量元素个数

        if (M % N != 0)

        {

            ret = M / N +1;

        }

        else

        {

            ret = M / N;

        }

        

        X = X - ret;    

        

        //当X < 0的时候跳出循环

        if (X < 0)

        {

            break;

        }

        //战斗力提高

        N = N + M / N;

    }

    printf("%d\n", N);


    return 0;

}


 

0.0分

2 人评分

  评论区

  • «
  • »