华为OD机试C卷- 运输时间(Java & JS & Python & C).md-私信看全套OD代码及解析

preview
需积分: 0 1 下载量 87 浏览量 更新于2024-06-09 收藏 4KB MD 举报
### 华为OD机试C卷 - 运输时间题目详解 #### 题目背景与目标 在本题目中,我们需要解决的问题是模拟多辆汽车在一条不允许超车的单行道上的行驶过程,并计算最后一辆汽车到达目的地所需的时间。具体来说,有M(1≤M≤20)辆汽车依次从起点出发前往终点,每辆车的速度不同,且起点到终点的距离为N(1≤N≤400)。特别地,当一辆车追上前面速度较慢的车辆时,它必须按照较慢车辆的速度行驶。任务是计算最后一辆车到达终点所需的总时间。 #### 输入输出说明 - **输入格式**: - 第一行包含两个整数M和N,分别表示车辆总数和到终点的距离。 - 接下来M行,每行一个整数S,表示每辆车的速度(0<S<30)。 - **输出格式**: - 输出一个浮点数,表示最后一辆车到达目的地所花费的时间。 #### 解题思路 要解决此问题,我们可以按顺序处理每辆车,跟踪每辆车的实际行驶时间和状态。主要考虑的因素包括: - 每辆车的初始出发时间与其序号相等,即第i辆车在i小时后出发。 - 当后车追上前车时,两车将以相同的速度前进,直至到达终点。 - 如果后车永远无法追上前车,则其将单独按照自己的速度行驶至终点。 基于以上规则,我们可以通过模拟的方式来求解: 1. **初始化**:设置一个变量`totalTime`用于存储最后一辆车达到终点的最大时间。假设第一辆车以自己的速度到达终点所需的时间作为初始值。 2. **模拟行驶过程**:对于每一对相邻的车辆,计算出后车追上前车的时间。这涉及到当前车与前车之间的初始距离(即出发时间差乘以后车的速度)和两车的速度差。 3. **更新时间**:根据追上时间来决定是否需要更新`totalTime`的值。如果后车追上前车的时间小于前车到达终点的时间,则说明后车被前车限制了速度;否则,后车将继续以自己的速度行驶至终点。 4. **最终输出**:遍历所有车辆后,`totalTime`的值即为所求的结果。 #### 示例代码实现 下面分别给出使用Java、Python 和 JavaScript 的示例代码实现。 ### Java实现 ```java import java.util.Scanner; public class CarRace { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int M = scanner.nextInt(); // 车辆数 int N = scanner.nextInt(); // 终点距离 int[] speeds = new int[M]; // 各车速度 // 读取各车速度 for (int i = 0; i < M; i++) { speeds[i] = scanner.nextInt(); } // 计算最后一辆车到达目的地花费的时间 double totalTime = N / (double)speeds[0]; // 第一辆车的时间 for (int i = 1; i < M; i++) { // 计算两车相遇时间,由于每辆车之间间隔1小时出发,相遇时前车已行驶i小时 double meetTime = (N - speeds[i] * i) / (double)(speeds[i] - speeds[i - 1]); // 如果相遇时间大于前车到达终点时间,则说明没有追上,直接以前车到达时间为基准 if (meetTime < 0) { meetTime = N / (double)speeds[i - 1]; } totalTime = Math.max(totalTime, meetTime + i + N / (double)speeds[i]); } System.out.println(totalTime); } } ``` ### Python实现 ```python M, N = map(int, input().split()) speeds = [int(input()) for _ in range(M)] total_time = N / speeds[0] for i in range(1, M): meet_time = (N - speeds[i] * i) / (speeds[i] - speeds[i - 1]) # 计算两车相遇时间 # 如果没有追上,则以前车到达时间为基准 if meet_time < 0: meet_time = N / speeds[i - 1] total_time = max(total_time, meet_time + i + N / speeds[i]) print(total_time) ``` ### JavaScript实现 ```javascript const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); let inputs = []; rl.on('line', (input) => { inputs.push(input); }).on('close', () => { const [M, N] = inputs[0].split(' ').map(Number); const speeds = inputs.slice(1).map(Number); let totalTime = N / speeds[0]; for (let i = 1; i < M; i++) { let meetTime = (N - speeds[i] * i) / (speeds[i] - speeds[i - 1]); if (meetTime < 0) { meetTime = N / speeds[i - 1]; } totalTime = Math.max(totalTime, meetTime + i + N / speeds[i]); } console.log(totalTime); }); ``` #### 总结 通过以上分析与实现,我们已经能够有效地解决了题目中的问题。该问题的关键在于理解题目描述并正确地模拟每辆车的行驶过程。此外,需要注意的是,由于每辆车之间固定的出发时间差,这也增加了问题的复杂性。提供的三种语言实现示例可以帮助不同背景的读者更好地理解和实现解决方案。
身份认证 购VIP最低享 7 折!
30元优惠券