华为机试题-单车道汽车通行时间

代码在最后面

1 题目描述

M(1 ≤ M ≤ 20)辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为 N(1 ≤ N ≤ 400)。

速度快的车追上前车后,只能以前车的速度继续行驶,求最后一辆车到达目的地花费的时间。

注:每辆车固定间隔 1 小时出发,比如第一辆车 0 时出发,第二辆车 1 时出发,依次类推

2 输入描述

第一行两个数字:M N,分别代表车辆数和到终点的距离,以空格分隔。

接下来 M 行,每行一个数字 S,代表每辆车的速度。

0 < S < 30

3 输出描述

最后一辆车到达目的地花费的时间

4 示例

4.1 示例1

复制代码
输入	
2 10
4
2
输出	
5

解释:

第一行,表示2辆车,起点到终点的距离为10个单位。

第一辆车的速度为4,则第一辆车到终点的时间 2.5 = 10 / 4

第二辆车的速度为2,则第二辆车到终点的时间 5 = 10 / 2

由于第一辆车比第二辆车快,所以不存在阻塞问题,即最终答案为 5

4.1 示例2

复制代码
输入	
2 10
2
4
输出	
4

解释:

第一行,表示2辆车,起点到终点的距离为10个单位。

第一辆车的速度为2,则第一辆车到终点的时间 5 = 10 / 2

第二辆车的速度为4,则第二辆车到终点的时间 2.5 = 10 / 4

由于第一辆车比第二辆车慢,所以存在阻塞问题,第二辆车并不能用2.5个时间单位到达目的地。但由于车辆是每隔1个时间单位出发, 1 + 2.5 = 3.5 < 5,所以第二辆车的到车时间是 5,但发车时间为 1,即第二辆车用时 4 = 5 -1 个时间单位。

5 代码解题

第二个示例是我写的,其实根据第二个示例就能看出来,这个题怎么解了。

假设没有阻塞问题,即后一辆车不会被前一辆车阻塞,只考虑发车时间和车速。

记发车时间为 start,记车速为 v,记总路程为 S(也就是N),那么可以计算出每辆车到达终点的最终时间点h = start + S / v。【最终时间不是车辆通过路段的用时,而是一个时间点】

然后代入阻塞问题中,已知后一辆车会被前一辆车阻塞,记MaxH为所有车到达终点的时间最大值,记第X辆车到终点的时间为 MaxH。那么可以得出结论,X...M辆车必定不能在MaxH之前到达终点。由此可以计算出,最后一辆车的用时为 T = MaxH - (start - 1)【start - 1 表示发车时,距离0时的间隔时间】

代入示例二,进行思路验证:

复制代码
2 10 // 两辆车,路程10个单位
2 // 第一辆车,0点发车,车速单位为2,最终到达终点时间点 5 = 0 + 10 / 2
4 // 第一辆车,1点发车,车速单位为4,最终到达终点时间点 3.5 = 1 + 10 / 4
--- 代入上述公式
所有车到达终点的时间最大值 MaxH = 5
最后一辆车用时 T = MaxH - (start - 1) = 5 - (2 - 1) = 4
符合预期,完美

解题代码

Java 复制代码
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String line = scanner.nextLine();
        String[] split = line.split(" ");
        final int M = Integer.parseInt(split[0]);
        final int N = Integer.parseInt(split[1]);
        double maxH = 0;
        // i 表示发车时间,i + 1 表示发车序号,i = 0 < M 循环也是 M 次,所以省略车序号计算
        for (int i = 0; i < M; i++) {
            // 车速度
            int v = scanner.nextInt();
            maxH = Math.max(maxH, (double) N / v + i);
        }
        // M - 1 表示最后一辆车发车时间点
        double time = maxH - (M - 1);
        scanner.close();
        System.out.println(time);
    }
}
相关推荐
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
lhldsg4 小时前
全民健身解决方案小程序开发:从0到1的技术实战
java·数据库·需求分析
jason成都4 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
泡海椒4 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb4 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye4 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术4 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
小羊没烦恼!5 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
sanjiaomao3335 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
乐迪信息5 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪