小杨每走 1 公里 就能获得 1 点 基础环保能量。同时,每走满 x 公里 会额外获得 1 点 奖励能量。已知小杨一共走了 n 公里,要求计算总共获得的能量点数。
关键点:
n 点。x 公里触发一次,也就是在走了 x, 2x, 3x …… 公里时会分别奖励 1 点。因此,额外奖励的次数等于 n 以内有多少个 x 的倍数。
总能量 = 基础能量 (n) + 额外奖励次数。
有两种常见的解法:
按照题目描述直接模拟每一公里的情况:
这种方法直观易懂,但时间复杂度与 n 成正比。题目中 n 最大为 1000,完全可行。
直接计算:
总能量 = n + (n / x)
这种方法只需要 O(1) 的时间。
参考代码使用的是 方法一 的循环模拟:
cpp1#include <iostream> 2using namespace std; 3int main() { 4 int t, n, x; 5 if (!(cin >> t)) return 0; 6 while (t--) { 7 cin >> n >> x; 8 int ans = 0; 9 for (int i = 1; i <= n; i++) { 10 ans += 1; // 基础能量 11 if (i % x == 0) { 12 ans += 1; // 额外奖励 13 } 14 } 15 cout << ans << endl; 16 } 17 return 0; 18}
代码解释:
t。n 和 x。ans 为 0。for 循环模拟从第 1 公里到第 n 公里:
ans 加 1(基础能量)。if (i % x == 0) 判断当前公里数是否为 x 的整数倍,若是则 ans 再加 1。ans。如果你掌握了除法运算,也可以将循环替换为更简单的一行公式:
cpp1cout << n + n / x << endl;
效果完全相同,而且速度更快。
循环模拟方法:
公式计算方法:
两种方法在本题数据规模下都能通过,建议理解循环原理的同时也掌握公式推导,以应对更大数据范围的题目。