• 华为OD机考算法题:运输时间


    题目部分

    题目运输时间
    难度
    题目说明M(1<=M<=20)辆车需要在一条不能超车的单行道到达终点,起点到终点的距离为N(1<=N<=400)。速度快的车追上前车后,只能以前车的速度继续行驶。求最后一车辆到达目的地花费的时间。
    注:每辆车固定间隔一小时出发,比如第一辆车0时出发,第二辆车1时出发,以此类推。
    输入描述第一行两个数字:M N分别代表车辆数和到终点的距离,以空格分隔。
    接下来M行,每行1个数字S,代表每辆车的速度。0
    输出描述最后一辆车到达目的地花费的时间。
    补充说明
    ------------------------------------------------------
    示例
    示例1
    输入2 11
    3
    2
    输出5.5
    说明2 辆车,距离 11,0 时出发的车速度快,1 时出发的车,到达目的的花费为 5.5。


    解读与分析

    题目解读

    每隔 1 小时发出 1 辆车,如果后车的速度比较快,已经赶上了前车,则速度与前车保持一致。求最后一辆车,从发车到终点,需要多少时间。

    分析与思路

    虽然此题难度为“难”,但思路却非常简单。
    从 0 时开始,依次计算每辆车需要的时间,由于后发的车速度较快,如果后发的车赶上前车,则到达时间为前车时间减 1 。从第 1 辆车开始,一直算到最后一辆车。

    时间复杂度为 O(n),空间复杂为 O(n)。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 运输时间
    4. * @since 2023.09.21
    5. * @version 0.1
    6. * @author Frank
    7. *
    8. */
    9. public class TransportTime {
    10. public static void main(String[] args) {
    11. Scanner sc = new Scanner(System.in);
    12. while (sc.hasNext()) {
    13. String line = sc.nextLine();
    14. String[] cntDistance = line.split( " " );
    15. int count = Integer.parseInt( cntDistance[0] );
    16. int distance = Integer.parseInt( cntDistance[1] );
    17. String[] inputs = new String[count];
    18. for( int i = 0; i < count; i ++ )
    19. {
    20. inputs[i] = sc.nextLine();
    21. }
    22. processTransportTime( count, distance, inputs );
    23. }
    24. }
    25. private static void processTransportTime( int count, int distance, String inputs[] )
    26. {
    27. float minTime = 0;
    28. for( int i = 0; i < count; i ++ )
    29. {
    30. int speed = Integer.parseInt( inputs[i] );
    31. float curTime = (float) distance / speed;
    32. if( i == 0 )
    33. {
    34. minTime = curTime;
    35. continue;
    36. }
    37. if( curTime < minTime - 1 )
    38. {
    39. minTime = minTime - 1;
    40. }else
    41. {
    42. minTime = curTime;
    43. }
    44. }
    45. System.out.println( minTime );
    46. }
    47. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var cntDistance = line.split(" ");
    7. var cnt = cntDistance[0];
    8. var distance = cntDistance[1];
    9. var speeds = new Array();
    10. for (var i = 0; i < cnt; i++) {
    11. line = await readline();
    12. speeds[i] = parseInt( line );
    13. }
    14. processTransportTime(distance, speeds);
    15. }
    16. }();
    17. function processTransportTime( distance,speeds) {
    18. var minTime = 0;
    19. for (var i = 0; i < speeds.length; i++) {
    20. var speed = parseInt(speeds[i]);
    21. var curTime = distance / speed;
    22. if (i == 0) {
    23. minTime = curTime;
    24. continue;
    25. }
    26. if (curTime < minTime - 1) {
    27. minTime = minTime - 1;
    28. } else {
    29. minTime = curTime;
    30. }
    31. }
    32. console.log(minTime);
    33. }

    (完)

  • 相关阅读:
    Python进阶之迭代器
    应用在摄像头对焦镜头中的马达驱动芯片
    gRPC之metadata
    2022-9月报
    二层环路的产生与危害(真实环境感受)
    通达信l1l2行情接口-十档行情有哪些优势?
    网络和Linux网络_3(套接字编程)TCP网络通信代码(多个版本)
    【校招VIP】java开源框架之spark
    年薪50W的软件测试面试题,到底长啥样?
    通讯网关软件028——利用CommGate X2Modbus实现Modbus RTU访问PI服务器
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133087272