解题思路:
题目:
雇佣兵的体力最大值为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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复