题解:洛谷 P1423 小玉在游泳

【题目来源】

洛谷:P1423 小玉在游泳 - 洛谷

【题目描述】

小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 \(2\) 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 \(98\%\)。现在小玉想知道,如果要游到距离 \(s\) 米的地方,她需要游多少步呢。请你编程解决这个问题。

【输入】

输入一个实数 \(s\)(单位:米),表示要游的目标距离。

【输出】

输出一个整数,表示小玉一共需要游多少步。

【输入样例】

4.3

【输出样例】

3

【核心思想】

  1. 问题分析:小玉第一步游 \(2\) 米,之后每步距离为上一步的 \(98\%\)。给定目标距离 \(s\),求需要游多少步才能到达或超过 \(s\)。这是一个等比数列累加模拟问题。

  2. 算法选择

    • 循环累加模拟:每步累加当前步长到总距离,然后步长乘以 \(0.98\),直到总距离 \(\ge s\)
  3. 关键步骤

    • 读入数据cin >> n(目标距离)
    • 初始化len = 0(已游距离),step = 2(当前步长),ans = 0(步数计数器)
    • 循环累加(当 len < n):
      • len += step:累加当前步长
      • step *= 0.98:步长衰减为 \(98\%\)
      • ans++:步数加 1
    • 输出结果ans
  4. 时间/空间复杂度

    • 时间复杂度:\(O(\log_{0.98}(s))\),步长按等比数列衰减,步数与目标距离成对数关系
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 等比衰减累加的核心思想

    • 递推步长:每步步长是上步的固定比例(\(0.98\)),形成等比数列
    • 累积距离判定:不预先计算总距离公式,而是逐步累加,直到满足条件
    • 浮点比较len < n 作为循环条件,浮点数累加可能产生精度误差,但题目数据范围内可接受
    • 适用于等比数列、逐步衰减、累积模拟类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    double n;            // 定义变量:目标距离n米
    double len = 0;      // 定义变量:当前已跑距离,初始为0
    double step = 2;     // 定义变量:当前步长,初始为2米
    int ans = 0;         // 定义变量:跑步天数计数器

    cin >> n;            // 输入目标距离

    // 循环计算达到目标距离所需天数
    while (len < n)
    {
        len += step;     // 累加当天跑步距离
        step *= 0.98;    // 更新步长(每天衰减为前一天的98%)
        ans++;           // 天数计数器加1
    }

    cout << ans;         // 输出所需天数

    return 0;            // 程序正常结束
}

【运行结果】

4.3
3
posted @ 2026-08-05 15:45  团爸讲算法  阅读(26)  评论(0)    收藏  举报