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

devtools/2024/12/27 6:51:09/

问题描述

在 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 t1else:accel_time = v / aremaining_distance = l - 0.5 * v * v / areturn 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 / adist_accel_to_w = 0.5 * w * w / aelse: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 / adist_decel_to_w = 0.5 * w * w / aelse: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.ppmy.cn/devtools/145745.html

相关文章

【gopher的java学习笔记】Spring Boot Starter初探

转到java这边后&#xff0c;这天需要搭一个java的web service出来&#xff0c;如果是以前golang的话&#xff0c;那我就可以非常熟练的用gin搭建一个web service出来&#xff0c;核心逻辑就是写好一些rest接口实现后再加上最为灵魂的一句&#xff1a; // 启动Gin服务器在8080端…

工控界面还得是工业风的设计看着舒服

工控界面采用工业风设计&#xff0c;确实给人一种独特的舒适感。这种风格通常以冷色调为主&#xff0c;如沉稳的蓝、灰等颜色&#xff0c;营造出冷静、专业的氛围。界面布局规整且简洁&#xff0c;功能模块划分清晰&#xff0c;各种仪表、图表和按钮一目了然&#xff0c;便于操…

Android Studio 的革命性更新:Project Quartz 和 Gemini,开启 AI 开发新时代!

&#x1f31f; Android Studio 的革命性更新&#xff1a;Project Quartz 和 Gemini&#xff0c;开启 AI 开发新时代&#xff01; 在这个技术飞速发展的时代&#xff0c;Android 开发者们迎来了两项重大更新&#xff1a;Project Quartz 和 Gemini。这不仅仅是更新&#xff0c;而…

大数据与AI驱动下的电商平台API接口创新

在当今数字化驱动的商业世界中&#xff0c;电商行业正以前所未有的速度蓬勃发展&#xff0c;成为经济增长的重要引擎。而在这繁荣景象的背后&#xff0c;大数据与AI的融合&#xff0c;以及电商平台API接口的创新&#xff0c;扮演了至关重要的角色。本文将从大数据与AI对电商平台…

Java(Sprigboot) 项目调用第三方 WebService 接口实现方式

文章目录 Java(Sprigboot) 项目调用第三方 WebService 接口实现方式WebService 简介业务场景描述WSDL 文档请求地址及方式接口请求/响应报文 代码实现1、接口请求/响应报文 JSON 准备&#xff08;1&#xff09;TransData&#xff08;2&#xff09;BaseInfo、InputData、OutputD…

Kafka无锁设计

前言 在分布式消息队列系统中,Kafka 的无锁设计是其高吞吐量和高并发的核心优势之一。通过避免锁的竞争,Kafka 能够在高并发和大规模的生产环境中保持高效的性能。为了更好地理解 Kafka 的无锁设计,我们首先对比传统的队列模型,然后探讨 Kafka 如何通过无锁机制优化生产者…

bash 中 ${-#*i} 是什么意思?

-------------------------------------------------- author: hjjdebug date: 2024年 12月 25日 星期三 17:43:45 CST description: bash 中 ${-#*i} 是什么意思? -------------------------------------------------- 在centos 的 /etc/profile 中有这样的语句 for i in /…

【算法题解】Bindian 山丘信号问题(E. Bindian Signaling)

问题描述 在 Berland 古老的 Bindian 部落中&#xff0c;首都被 nn 座山丘围成一个圆环&#xff0c;每个山丘上都有一名守望者&#xff0c;日夜观察着周围的情况。 如果有危险&#xff0c;守望者可以在山丘上点燃篝火。两座山丘的守望者可以看到彼此的信号&#xff0c;条件是…