洛谷P14027题解

分析

题意

小 C 初始能力值是 aa,目标能力值是 bb(已知 a<ba < b),还有一个参数 kk。每天他有两种训练选择:

  • 普通训练:能力值变成当前值加 kk

  • 加训加训:能力值变成当前值乘 kk

我们需要算出小 C 至少要训练几天,才能让能力值大于等于 bb

思路

每次训练都选能让能力值增长更快的方式,从而用最少天数达到目标。

当某次训练后,不管选哪种方式都能达到或超过 bb 时,直接算 11 天就能完成。

k=1k = 1 时,乘 kk 相当于能力值不变,所以此时只能一直选普通训练(加 kk)。不过代码里不用单独处理 k=1k=1,因为当 k=1k=1 时,cur×k=curcur \times k = curcur+k=cur+1cur + k = cur + 1,自动选择加 kk 的方式。

整体思路是循环判断当前能力值 curcur 是否小于 bb

先看乘 kk 或加 kk 能不能直接到 bb 及以上,能的话天数加 11 就结束;

如果不能,就选乘 kk 和加 kk 里能让能力值更大的那种方式,天数加 11,然后继续循环。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
typedef long long ll; // 开 long long
int main() {
int a, b, k;
cin >> a >> b >> k;
int ans = 0;// 训练天数
ll cur = a;// 当前能力值
while (cur < b) {
// 情况1
if (cur * k >= b) {
ans++;
break;
}
// 情况2
else if (cur + k >= b) {
ans++;
break;
}
// 情况3
else {
if (cur * k > cur + k) {
cur *= k;
} else {
cur += k;
}
ans++;
}
}
cout << ans << endl;
return 0;
}

洛谷P14027题解
https://lijingshu2014.github.io/2025/10/03/洛谷P14027题解/
作者
lijingshu
发布于
2025年10月3日
许可协议