题解:洛谷 P1423 小玉在游泳
【题目来源】
【题目描述】
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 \(2\) 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 \(98\%\)。现在小玉想知道,如果要游到距离 \(s\) 米的地方,她需要游多少步呢。请你编程解决这个问题。
【输入】
输入一个实数 \(s\)(单位:米),表示要游的目标距离。
【输出】
输出一个整数,表示小玉一共需要游多少步。
【输入样例】
4.3
【输出样例】
3
【核心思想】
-
问题分析:小玉第一步游 \(2\) 米,之后每步距离为上一步的 \(98\%\)。给定目标距离 \(s\),求需要游多少步才能到达或超过 \(s\)。这是一个等比数列累加模拟问题。
-
算法选择:
- 循环累加模拟:每步累加当前步长到总距离,然后步长乘以 \(0.98\),直到总距离 \(\ge s\)
-
关键步骤:
- 读入数据:
cin >> n(目标距离) - 初始化:
len = 0(已游距离),step = 2(当前步长),ans = 0(步数计数器) - 循环累加(当
len < n):len += step:累加当前步长step *= 0.98:步长衰减为 \(98\%\)ans++:步数加 1
- 输出结果:
ans
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(\log_{0.98}(s))\),步长按等比数列衰减,步数与目标距离成对数关系
- 空间复杂度:\(O(1)\),仅需常数个变量
-
等比衰减累加的核心思想:
- 递推步长:每步步长是上步的固定比例(\(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
浙公网安备 33010602011771号