(新卷,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;
}
网硕互联帮助中心


评论前必须登录!
注册