洛谷T664741 题解
(我也就会写点水题了)
问题分析
- 小 C 初始能力值为 a,目标是达到或超过 b(a < b)
- 每天可以选择两种训练方式:普通训练( + k )或加训( * k )
- 需要计算最少需要多少天才能达到目标
程序逻辑
-
首先处理特殊情况:当 k=1 时,只能选择普通训练(因为 ×1 不会改变值),所以需要 (b-a) 天
-
当 k>1 时,采用两步策略:
- 先通过普通训练使能力值达到或超过 k
- 之后全部使用加训( * k ),因为此时乘法增长比加法更快
AC代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int a,b,k,ans=0;
int main(){
scanf("%d%d%d",&a,&b,&k);
if(k==1){
printf("%d",b-a);
return 0;
}
while(a<k){
ans++;a+=k;
}
while(a<b){
ans++;a*=k;
}
printf("%d",ans);
return 0;
}
代码解释
- 变量定义:a(初始值)、b(目标值)、k(增长参数)、ans(天数计数)
- 输入处理:读取 a、b、k 的值
- 特殊情况处理:当 k=1 时直接计算 b-a 并输出
- 第一阶段循环:当 a < k 时,持续进行普通训练(+k),累加天数
- 第二阶段循环:当 a < b 时,持续进行加训(×k),累加天数
- 输出最终的天数计数 ans