1 条题解
-
0
问题分析
本题是一道关于车辆超车模拟与到达时间计算的问题,核心任务是模拟多辆车在不同时间段的行驶状态,计算给定初始时间出发的车辆到达终点的时间。车辆行驶速度不同,且存在超车限制(只能被速度更快的车超越),需要通过动态规划和二分查找优化计算过程。
算法思路
1. 数据初始化与预处理
- 输入参数:
l(道路长度)、n(车辆数量)、t(初始时间)、v(车辆速度)、x(目标车辆速度)、m(时间分段数)、a(时间分段点)。 - 时间计算:计算每个时间段
i内每辆车的位置t[i][j],公式为: 表示车辆j在时间段i的位置等于上一时间段的位置加上速度乘以时间差。 - 超车处理:同一时间段内,若多辆车在同一位置,速度慢的车会被速度快的车超越,因此更新位置为当前最大位置:$$t[i][id[i-1][k]] = \max(t[i][id[i-1][k]], \text{nowmx})
$$其中
id[i-1][k]是按上一时间段位置排序的车辆编号,nowmx是当前已处理车辆的最大位置。 - 排序与筛选:对每个时间段的车辆位置排序,筛选出速度大于
x的车辆(可能对目标车辆造成阻碍),存储在at[i]中。
2. 动态规划与二分查找(
calc函数)- 状态定义:
dp[i][now]表示在时间段i,目标车辆到达at[i][now]位置时,到达终点的最小时间。 - 二分查找:对于当前时间段
i和位置nowt,查找最早的时间段res,使得目标车辆能在不被阻挡的情况下到达该时间段,条件为: 即目标车辆以速度x行驶到时间段res的位置不超过该时间段的阻挡车辆位置。 - 状态转移:
- 若找不到符合条件的
res,则目标车辆可直接行驶到终点,时间为nowt + x * (a[m] - a[i])。 - 否则,递归计算
calc(res, at[res][now]),得到到达终点的时间。
- 若找不到符合条件的
3. 到达时间计算
- 对于初始时间
st,调用calc(1, st)计算从第一个时间段开始,目标车辆的最终到达时间。
关键公式与复杂度
-
位置更新公式:
时间复杂度:
O(m*n),其中m为时间段数,n为车辆数。 -
超车处理: 通过排序和遍历更新位置,时间复杂度:
O(m*n log n)(排序耗时)。 -
动态规划与二分查找:
- 二分查找时间复杂度:
O(log m)。 - 递归深度:
O(m),总时间复杂度:O(m log m)。
- 二分查找时间复杂度:
-
总复杂度:
O(m*n log n + Q*m log m),其中Q为查询次数,适合处理n, m ≤ 1000的规模。
代码解析
模块 功能描述 初始化( init)计算各时间段车辆位置,处理超车情况,筛选阻挡车辆并排序。 动态规划( calc)利用二分查找寻找最早可到达的时间段,递归计算到达终点的时间。 主函数( arrival_time)接收初始时间,调用 calc函数返回最终到达时间。算法的核心是通过预处理车辆位置和超车情况,结合动态规划与二分查找高效计算目标车辆的到达时间,避免了对每辆车行驶状态的逐时刻模拟,大幅提升了计算效率。
- 输入参数:
- 1
信息
- ID
- 3593
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者