题解:学而思编程 青蛙跳
【题目来源】
学而思编程:青蛙跳
【题目描述】
一个青蛙位于 \(x\) 轴的 \(0\) 点。
它将进行 \(k\) 次跳跃,其中:
第 \(1,3,5…\) 次(奇数次)跳跃,向右跳 \(a\) 单位长度,即从 \(x\) 跳到 \(x+a\)。
第 \(2,4,6…\) 次(偶数次)跳跃,向左跳 \(b\) 单位长度,即从 \(x\) 跳到 \(x−b\)。
请问,最终它将跳到哪个位置?
【输入】
第一行包含整数 \(T\),表示共有 \(T\) 组测试数据。
每组数据占一行,包含三个整数 \(a,b,k\)。
【输出】
每组数据输出一行结果,一个整数表示青蛙最终所在的位置坐标。
【输入样例】
2
1 1 1
1 1 2
【输出样例】
1
0
【核心思想】
-
问题分析:青蛙从 \(0\) 出发,进行 \(k\) 次跳跃。奇数次向右跳 \(a\),偶数次向左跳 \(b\)。求最终位置。这是一个周期分析 + 奇偶分类问题,关键在于将跳跃按奇偶配对,利用周期性简化计算。
-
算法选择:
- 周期配对:每两次跳跃(一奇一偶)构成一个周期,净位移为 \(a - b\)
- 奇偶处理:\(k\) 为偶数时恰好整周期;\(k\) 为奇数时多一次向右跳
-
关键步骤:
- 初始化:读取 \(T\)(测试组数)
- 处理每组数据:
- 读取 \(a, b, k\)
s = (a - b) * (k / 2):完整周期的净位移(\(k/2\) 个周期,每周期净位移 \(a - b\))- 若
k % 2 == 1(\(k\) 为奇数):s += a:最后多一次奇数次跳跃(向右 \(a\))
- 输出
s
-
时间/空间复杂度:
- 时间复杂度:\(O(T)\),每组数据 \(O(1)\) 计算
- 空间复杂度:\(O(1)\),仅需常数变量
-
周期配对的核心思想:
- 跳跃模式识别:奇数次右跳 \(+a\),偶数次左跳 \(-b\),形成固定的 \((+a, -b)\) 周期
- 整数除法取整:
k / 2自动向下取整,得到完整周期数,余数通过k % 2判断 - 奇数补偿:奇数次跳跃意味着最后停留在右跳阶段,需额外加 \(a\)
- 公式化简:无需模拟每次跳跃,直接数学计算,将 \(O(k)\) 降为 \(O(1)\)
- 适用于"交替操作 + 周期规律"类问题,识别周期后可大幅优化计算效率
【算法标签】
数学
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long
int T, a, b, k, s; // T: 测试用例数, a: 向上走的值, b: 向下走的值, k: 总步数, s: 最终位置
signed main()
{
cin >> T; // 输入测试用例数
while (T--) // 处理每个测试用例
{
cin >> a >> b >> k; // 输入a,b,k
s = (a - b) * (k / 2); // 计算完整周期的净位移
if (k % 2 == 1) // 如果步数为奇数
{
s += a; // 最后一步向上
}
cout << s << endl; // 输出最终位置
}
return 0;
}
【运行结果】
2
1 1 1
1
1 1 2
0
浙公网安备 33010602011771号