文章

【GESP】C++二级练习 luogu-P1426 小鱼会有危险吗

GESP二级练习,多层循环和分支练习,难度★✮☆☆☆。

luogu-P1426 小鱼会有危险吗

题目要求

题目描述

有一次,小鱼要从 A 处沿直线往右边游,小鱼第一秒可以游 $7$ 米,从第二秒开始每秒游的距离只有前一秒的 $98\%$。有个极其邪恶的猎人在距离 A 处右边 $s$ 米的地方,安装了一个隐蔽的探测器,探测器左右 $x$ 米之内是探测范围。一旦小鱼进入探测器的范围,探测器就会在这一秒结束时把信号传递给那个猎人,猎人在一秒后就要对探测器范围内的水域进行抓捕,这时如果小鱼还在这范围内就危险了。也就是说小鱼一旦进入探测器范围,如果能在下 $1$ 秒的时间内马上游出探测器的范围,还是安全的。现在给出 $s$ 和 $x$ 的数据,请你判断小鱼会不会有危险?如果有危险输出 y,没有危险输出 n

输入格式

一行内输入两个实数,用空格分隔,表示 $s$ 和 $x$。

输出格式

一行内输出’y’或者’n’表示小鱼是否会有危险。

输入 #1

1
14 1

输出 #1

1
n

数据规模与约定

对于 $100\%$ 的数据,保证 $1 \leq s,x\le100$,小数点后最多有 $6$ 位小数。


题目分析

解题思路

  1. 首先,我们需要理解题目的核心要求:
    • 判断小鱼是否会进入危险区域
  2. 解题思路:
    • 小鱼每秒游的距离逐渐减少
    • 需要判断小鱼是否会进入探测器的范围
    • 如果小鱼进入探测器范围,判断其能否在下一秒内游出
  3. 具体实现:
    • 读入目标距离s和误差范围x
    • 初始化当前速度和总距离
    • 使用循环模拟小鱼的游动过程
    • 检查小鱼是否进入探测器范围
    • 判断小鱼能否在下一秒内游出探测器范围
    • 输出结果为‘y’或‘n’表示小鱼是否会有危险


示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
using namespace std;
int main() {
    double s, x;  // 定义变量:s为目标距离,x为误差范围
    cin >> s >> x;  // 输入目标距离和误差范围
    double t = 0;  // 定义变量t,表示当前速度
    double ans = 0;  // 定义变量ans,表示当前总距离
    for (int i = 1;; i++) {  // 无限循环,直到满足条件退出
        if (ans >= s - x) {  // 如果当前总距离大于等于目标距离减去误差范围
            if (ans + t * 0.98 > s + x) {  // 如果当前总距离加上减速后的速度大于目标距离加上误差范围
                cout << "n";  // 输出“n”,表示不能到达
                return 0;  // 结束程序
            } else {
                cout << "y";  // 输出“y”,表示可以到达
                return 0;  // 结束程序
            }
        }
        if (i == 1) {  // 如果是第一次循环
            t += 7;  // 初始速度增加7
        } else {
            t *= 0.98;  // 之后每次循环速度乘以0.98,表示减速
        }
        ans += t;  // 更新当前总距离
    }
    return 0;  // 结束程序
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权