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

题目部分

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


解读与分析

题目解读

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

分析与思路

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

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


代码实现

Java代码

import java.util.Scanner;

/**
 * 运输时间
 * @since 2023.09.21
 * @version 0.1
 * @author Frank
 *
 */
public class TransportTime {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String line = sc.nextLine();
			String[] cntDistance = line.split( " " );
			int count = Integer.parseInt( cntDistance[0] );
			int distance = Integer.parseInt( cntDistance[1] );
			
			String[] inputs = new String[count];
			for( int i = 0; i < count; i ++ )
			{
				inputs[i] = sc.nextLine();
			}			
			processTransportTime( count, distance, inputs );
		}
	}
	
	private static void processTransportTime( int count, int distance, String inputs[] )
	{
		float minTime = 0;
		for( int i = 0; i < count; i ++ )
		{
			int speed = Integer.parseInt( inputs[i] );
			float curTime = (float) distance / speed;
			if( i == 0 )
			{
				minTime = curTime;
				continue;
			}
			if( curTime < minTime - 1 )
			{
				minTime = minTime - 1;
			}else
			{
				minTime = curTime;
			}
		}
		System.out.println( minTime );
	}

}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {
    while (line = await readline()) {
        var cntDistance = line.split(" ");
        var cnt = cntDistance[0];
        var distance = cntDistance[1];

        var speeds = new Array();
        for (var i = 0; i < cnt; i++) {
            line = await readline();
            speeds[i] = parseInt( line );
        }
        processTransportTime(distance, speeds);
    }
}();

function processTransportTime( distance,speeds) {
    var minTime = 0;
    for (var i = 0; i < speeds.length; i++) {
        var speed = parseInt(speeds[i]);
        var curTime = distance / speed;
        if (i == 0) {
            minTime = curTime;
            continue;
        }
        if (curTime < minTime - 1) {
            minTime = minTime - 1;
        } else {
            minTime = curTime;
        }
    }
    console.log(minTime);
}

(完)

猜你喜欢

转载自blog.csdn.net/ZiJinShi/article/details/133087272