【算法题解】Berland 路标限速问题(Follow Traffic Rules)

news/2024/12/27 12:21:14 标签: 算法, 开发语言, python, 数据结构

问题描述

在 Berland 城市,有一条连接首都 Berland 和奥林匹克城市 Bercouvert 的公路。为了改善交通管理,这条路上设立了一个限速标志,限制某一段路程的最大速度。在通过这个标志之后,车辆可以恢复到任意速度。我们需要计算,Berland 的普通汽车以最优的速度完成整个路程所需的最短时间。

已知条件:

  1. 车辆的最大加速度为 aa km/h²,最大速度为 vv km/h。
  2. 公路全长为 ll 公里,其中限速标志位于起点 dd 公里的位置,限速为 ww km/h。
  3. 车辆在起点时速度为 0 km/h,最终要到达终点。

要求:

计算车辆从起点到终点的最短时间,结果保留至少 5 位小数。


输入格式:

第一行输入两个整数 aa 和 vv:

  • aa 表示车辆最大加速度 1≤a≤100001 \leq a \leq 10000;
  • vv 表示车辆最大速度 1≤v≤100001 \leq v \leq 10000。

第二行输入三个整数 l,d,wl, d, w:

  • ll 为公路总长度 2≤l≤100002 \leq l \leq 10000;
  • dd 为限速标志距离 1≤d<l1 \leq d < l;
  • ww 为限速标志的速度 1≤w≤100001 \leq w \leq 10000。

输出格式:

输出从起点到终点的最短时间,保留至少 5 位小数。


样例输入:

示例 1

1 1
2 1 3

输出

2.5000000000

示例 2

5 70
200 170 40

输出

8.9658746953

解题思路

  1. 基本情况分析

    • 如果限速 ww 大于或等于车辆的最大速度 vv,则限速标志的存在对行车无影响,我们只需要按照最大速度 vv 进行加速、匀速行驶和减速即可。
    • 如果限速 ww 小于最大速度 vv,则需要分段计算,分别处理以下几个阶段:
      1. 从起点到限速标志前,加速到限速速度 ww 或最大速度(以较小值为准)。
      2. 通过限速标志区域,以限速速度 ww 行驶。
      3. 限速区域之后到终点,加速到最大速度 vv 或直接减速。
  2. 分段计算公式

    • 根据匀加速公式 v2=u2+2asv^2 = u^2 + 2as,可以计算加速阶段所需时间和距离;
    • 匀速阶段的时间为 t=s/vt = s / v;
    • 总时间为三段时间的累加。

代码实现

以下是完整的 Python 实现代码:

import math

# 函数:计算最短时间
def minimum_time(a, v, l, d, w):
    # 情况 1:限速大于等于最大速度
    if w >= v:
        # 加速到最大速度并匀速行驶
        t1 = math.sqrt(2 * l / a)
        if t1 * a <= v:  # 不需要减速
            return t1
        else:
            accel_time = v / a
            remaining_distance = l - 0.5 * v * v / a
            return accel_time + remaining_distance / v

    # 情况 2:有限速区域
    # 第一阶段:加速到限速速度或最大速度
    t_accel_to_w = math.sqrt(2 * d / a)
    if t_accel_to_w * a > w:  # 速度不能超过限速
        t_accel_to_w = w / a
        dist_accel_to_w = 0.5 * w * w / a
    else:
        dist_accel_to_w = d

    # 第二阶段:限速区域内匀速行驶
    dist_in_zone = max(0, d - dist_accel_to_w)
    t_in_zone = dist_in_zone / w

    # 第三阶段:通过限速区域后继续行驶
    t_decel_to_w = math.sqrt(2 * (l - d) / a)
    if t_decel_to_w * a > w:  # 如果需要减速
        t_decel_to_w = w / a
        dist_decel_to_w = 0.5 * w * w / a
    else:
        dist_decel_to_w = l - d

    # 返回总时间
    return t_accel_to_w + t_in_zone + t_decel_to_w

# 输入数据
a, v = map(int, input().split())
l, d, w = map(int, input().split())

# 计算最短时间
result = minimum_time(a, v, l, d, w)

# 输出结果,保留 10 位小数
print(f"{result:.10f}")

样例测试

测试用例 1:

输入

1 1
2 1 3

输出

2.5000000000

测试用例 2:

输入

5 70
200 170 40

输出

8.9658746953

代码解析

  1. 输入处理

    • 第一行输入最大加速度 aa 和最大速度 vv;
    • 第二行输入道路总长度 ll、限速标志位置 dd、限速速度 ww。
  2. 分段逻辑

    • 通过加速公式、匀速公式、减速公式逐步计算时间;
    • 使用条件判断来处理特殊情况(如速度达到限速时的距离判断)。
  3. 输出格式

    • 使用 Python 的浮点数格式化功能,确保输出结果精确到至少 10 位小数。

总结

本题考察了物理运动学和算法分段处理的结合。通过严格的逻辑推导和分段计算,可以有效地解决复杂的运动路径最优时间问题。

关键词:数学建模、匀加速运动、分段计算、Python 实现


直接复制代码运行即可,欢迎在评论区讨论其他解法或优化思路! 😊


http://www.niftyadmin.cn/n/5801711.html

相关文章

【可靠有效】springboot使用netty搭建TCP服务器

Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…

STM32完全学习——FLASH上FATFS文件管理系统

一、需要移植的接口 我们通过看官网的手册&#xff0c;可以看到我们只要完成下面函数的实现&#xff0c;就可以完成移植。我们这里只移植前5个函数&#xff0c;获取时间的函数我们不在这里移植。 二、移植接口函数 DSTATUS disk_status (BYTE pdrv /* Physical drive nmuber…

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构&#xff0c;通过维护特定查找算法的数据结构&#xff08;如B树&#xff09;&#xff0c;以某种方式引用数据&#xf…

鸿蒙UI开发——使用WidthTheme实现局部深浅色

1、场景描述 在实际的应用开发中&#xff0c;我们可能需要在界面中局部应用深色或者浅色的界面样式&#xff0c;与全局的深色、亮色同时生效。场景例如&#xff1a;深/亮色预览。此时&#xff0c;我们可以使用WithTheme能力来达到我们的效果。 2、WithTheme WithTheme组件可…

VSCode 插件开发实战(十二):如何集成Git操作能力

前言 VSCode 不仅提供了丰富的编辑功能&#xff0c;还支持通过扩展插件来提升工作效率。本文将通过构建一个自定义 VSCode 插件&#xff0c;带你深入了解如何在编辑器中简化和自动化 Git 操作。这不仅能提升开发效率&#xff0c;还能减少人为操作失误&#xff0c;从而更加专注…

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

C++ 面向对象编程:关系运算符重载、函数调用运算符重载

对 、<、> 三个运算符分别进行重载&#xff0c;可见以下代码&#xff1a; #include<iostream> using namespace std;class location { public:location(int x1, int y1) :x(x1), y(y1){};bool operator(const location& l1) const{return x l1.x && …

文件路径与Resource接口详解

目录 第一章、快速了解文件路径1.1&#xff09;什么是文件路径&#xff1f;1.1.1&#xff09;绝对路径1.1.2&#xff09;相对路径 1.2&#xff09;重要&#xff1a;相对路径的表示方法1.2.1) ./ 与 ../ 1.3&#xff09;文件路径与环境变量1.3.1&#xff09;什么是环境变量1.3.2…