(C卷,200分)- 运输时间(Java & JS & Python & C)

题目描述

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

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

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

输入描述

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

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

输出描述

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

用例

输入 2 11
3
2
输出 5.5
说明 2辆车,距离11,0时出发的车速度快,1时出发的车,到达目的地花费5.5

题目解析

本题需要注意的是:速度快的车追上前车后,是可以和前车并行的。即本题的:

一条不能超车的单行道

指的应该是"单向"车道,即可能有多条单向车道,支持多辆车并行。

因此本题的解题就很简单了,由于后车不能超过前车,因此:

  • 如果后车正常行驶情况下,比前车更早到达,则会被前车阻碍,此时后车到达终点时刻,和前车一致
  • 如果后车正常行驶情况下,比前车更晚到达,则不会被前车阻碍,此时后车到达终点时刻,就是自己正常行驶到达终点的时刻

本题要求输出的是:到达目的地花费的时间 = 到达时刻 – 出发时刻

另外,需要注意,本题输出可能是小数,但是本题并没有说保留几位有效小数,我这边默认保留3位有效小数,四舍五入,实际考试时视情况改动。

JS算法源码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  const [m, n] = (await readline()).split(" ").map(Number);

  // 记录前车到达终点的时刻,本题后车不可能比前车更早到达,因此如果后车到达时刻 < 前车到达时刻arrived,则后车也是按照前车arrived时刻达到
  let arrived = 0;

  for (let i = 0; i < m; i++) {
    // 当前车的速度
    const speed = parseInt(await readline());
    // 当前车到达终点的时刻
    // * 当前车如果比前车更早到达,则被前车阻碍,按前车到达时间算
    // * 当前车如果比前车更晚到达,则不被前车阻碍,按后车到达时间算
    arrived = Math.max(arrived, n / speed + i); // n*1.0/speed是行驶花费时间; i是第i辆车的出发时间
  }

  // 到达时刻 - 出发时刻 = 路上花费的时间
  const cost = arrived - (m - 1);

  console.log(Number(cost.toFixed(3))); // 如果有小数位则至多保留3位
})();

Java算法源码

import java.text.NumberFormat;
import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    int m = sc.nextInt();
    int n = sc.nextInt();

    // 记录前车到达终点的时刻,本题后车不可能比前车更早到达,因此如果后车到达时刻 < 前车到达时刻arrived,则后车也是按照前车arrived时刻达到
    double arrived = 0;

    for (int i = 0; i < m; i++) {
      // 当前车的速度
      double speed = sc.nextDouble();
      // 当前车到达终点的时刻
      // * 当前车如果比前车更早到达,则被前车阻碍,按前车到达时间算
      // * 当前车如果比前车更晚到达,则不被前车阻碍,按后车到达时间算
      arrived = Math.max(arrived, n / speed + i); // n*1.0/speed是行驶花费时间; i是第i辆车的出发时间
    }

    // 到达时刻 - 出发时刻 = 路上花费的时间
    double cost = arrived - (m - 1);

    // 格式化打印小数
    NumberFormat nf = NumberFormat.getInstance();
    nf.setMinimumFractionDigits(0); // 没有小数位则不保留
    nf.setMaximumFractionDigits(3); // 有小数位则至多保留3位

    System.out.println(nf.format(cost));
  }
}

Python算法源码

# 输入获取
m, n = map(int, input().split())

# 记录前车到达终点的时刻,本题后车不可能比前车更早到达,因此如果后车到达时刻 < 前车到达时刻arrived,则后车也是按照前车arrived时刻达到
arrived = 0

for i in range(m):
    # 当前车的速度
    speed = int(input())
    # 当前车到达终点的时刻
    # * 当前车如果比前车更早到达,则被前车阻碍,按前车到达时间算
    # * 当前车如果比前车更晚到达,则不被前车阻碍,按后车到达时间算
    arrived = max(arrived, n / speed + i)  # n*1.0/speed是行驶花费时间; i是第i辆车的出发时间

# 到达时刻 - 出发时刻 = 路上花费的时间
cost = arrived - (m - 1)

print("{:g}".format(round(cost, 3)))  # 如果有小数位则至多保留3位,:g 用于去除无效小数位

C算法源码

#include <stdio.h>
#include <math.h>

int main() {
    int m, n;
    scanf("%d %d", &m, &n);

    // 记录前车到达终点的时刻,本题后车不可能比前车更早到达,因此如果后车到达时刻 < 前车到达时刻arrived,则后车也是按照前车arrived时刻达到
    double arrived = 0;

    for(int i=0; i<m; i++) {
        // 当前车的速度
        double speed;
        scanf("%lf", &speed);

        // 当前车到达终点的时刻
        // * 当前车如果比前车更早到达,则被前车阻碍,按前车到达时间算
        // * 当前车如果比前车更晚到达,则不被前车阻碍,按后车到达时间算
        arrived = fmax(arrived, n / speed + i); // n*1.0/speed是行驶花费时间; i是第i辆车的出发时间
    }

    // 到达时刻 - 出发时刻 = 路上花费的时间
    double cost = arrived - (m - 1);


    // 至多保留3个小数位
    char res[100];
    sprintf(res, "%.3f", cost);

    // %g 格式 不会打印无效小数位
    printf("%g", atof(res));

    return 0;
}

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?