题解:学而思编程 青蛙跳

【题目来源】

学而思编程:青蛙跳

【题目描述】

一个青蛙位于 \(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

【核心思想】

  1. 问题分析:青蛙从 \(0\) 出发,进行 \(k\) 次跳跃。奇数次向右跳 \(a\),偶数次向左跳 \(b\)。求最终位置。这是一个周期分析 + 奇偶分类问题,关键在于将跳跃按奇偶配对,利用周期性简化计算。

  2. 算法选择

    • 周期配对:每两次跳跃(一奇一偶)构成一个周期,净位移为 \(a - b\)
    • 奇偶处理\(k\) 为偶数时恰好整周期;\(k\) 为奇数时多一次向右跳
  3. 关键步骤

    • 初始化:读取 \(T\)(测试组数)
    • 处理每组数据
      • 读取 \(a, b, k\)
      • s = (a - b) * (k / 2):完整周期的净位移(\(k/2\) 个周期,每周期净位移 \(a - b\)
      • k % 2 == 1\(k\) 为奇数):
        • s += a:最后多一次奇数次跳跃(向右 \(a\)
      • 输出 s
  4. 时间/空间复杂度

    • 时间复杂度:\(O(T)\),每组数据 \(O(1)\) 计算
    • 空间复杂度:\(O(1)\),仅需常数变量
  5. 周期配对的核心思想

    • 跳跃模式识别:奇数次右跳 \(+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
posted @ 2026-07-05 15:56  团爸讲算法  阅读(10)  评论(0)    收藏  举报