B3894 [NICA #3] 开车旅行¶
题目描述¶
Aya 的学校组织了一场春游,春游的目的地是滨江森林公园。由于路途遥远,他们的行程会经过高速和地面道路。
学校所承包的大巴,在高速上是以 $a$ 千米/小时的速度匀速行驶,高速上一共行驶了 $b$ 小时;在地面上是以 $c$ 千米/小时的速度匀速行驶,地面上一共行驶了 $d$ 小时。
Aya 想知道以下两个问题的答案:
- 学校到滨江森林公园的路程有多长?
- 这辆大巴在旅途中的平均速度是多少?
输入格式¶
输入一行,四个实数 $a,b,c,d$。
输出格式¶
输出两行两个实数,均保留到小数点后一位。
第一行一个实数,表示学校到滨江森林公园的路程有多长。
第二行一个实数,表示这辆大巴在旅途中的平均速度是多少。
只要你的答案与标准答案的差距不超过 $0.1$,就被判作正确回答。
输入输出样例 #1¶
输入 #1¶
60 2 30 1
输出 #1¶
150.0
50.0
输入输出样例 #2¶
输入 #2¶
60 1.5 30 0.5
输出 #2¶
105.0
52.5
说明/提示¶
【样例解释】
对于样例 $1$,大巴在高速上以 $60$ 千米/小时的速度行驶 $2$ 小时,再以 $30$ 千米/小时的速度行驶 $1$ 小时,总共行驶了 $150$ 千米。平均速度 $=$ 路程 $\div$ 时间,可得平均速度为 $50$ 千米/小时。如果你输出的是 $149.9$ 和 $50.1$,也会是正确回答。
【数据范围】
对于所有数据,保证 $0 \leq a,b,c,d \leq 1000$,且 $b+d \neq 0$。
题解¶
下面按信奥赛标准流程,把 B3894 [NICA #3] 开车旅行 走一遍。
1. 审题:三遍读题¶
任务:
已知大巴:
- 高速速度 (a),高速时间 (b)
- 地面速度 (c),地面时间 (d)
求:
- 总路程;
- 全程平均速度。
输入:
一行四个实数 (a,b,c,d)。
输出:
两行,每行一个实数,均保留到小数点后一位:
- 第一行:总路程
- 第二行:平均速度
数据范围:
$(0 \le a,b,c,d \le 1000),且 (b+d \ne 0)。$
样例 1:
输入:
60 2 30 1
高速路程:
$
[
60 \times 2 = 120
]$
地面路程:
$
[
30 \times 1 = 30
]$
总路程:
$
[
120+30=150
]$
总时间:
[
2+1=3
]
平均速度:
$
[
150 \div 3 = 50
]$
输出:
150.0
50.0
2. 复杂度倒推¶
只有四个数,直接计算。
- 时间复杂度:(O(1))
- 空间复杂度:(O(1))
不需要算法优化,属于入门模拟题。
3. 核心公式¶
总路程:
$
[
S = a \times b + c \times d
]
$
总时间:
$
[
T = b + d
]$
平均速度:
$
[
v = \frac{S}{T}
]$
题目保证 $(b+d \ne 0)$,所以不会除以 0。
4. 伪代码¶
读入 a, b, c, d
S = a * b + c * d
T = b + d
v = S / T
输出 S,保留一位小数
输出 v,保留一位小数
5. 参考代码¶
#include <bits/stdc++.h>
using namespace std;
int main() {
double a, b, c, d;
cin >> a >> b >> c >> d;
double distance = a * b + c * d;
double totalTime = b + d;
double averageSpeed = distance / totalTime;
printf("%.1f\n", distance);
printf("%.1f\n", averageSpeed);
return 0;
}
如果习惯用 cout,也可以这样写:
#include <bits/stdc++.h>
using namespace std;
int main() {
double a, b, c, d;
cin >> a >> b >> c >> d;
double distance = a * b + c * d;
double averageSpeed = distance / (b + d);
cout << fixed << setprecision(1);
cout << distance << '\n';
cout << averageSpeed << '\n';
return 0;
}
6. 测试设计¶
样例 1¶
输入:
60 2 30 1
输出:
150.0
50.0
样例 2¶
输入:
60 1.5 30 0.5
计算:
$
[
60 \times 1.5 = 90
]$
$
[
30 \times 0.5 = 15
]$
总路程:
$
[
105
]$
总时间:
[
1.5+0.5=2
]
平均速度:
$
[
105 \div 2 = 52.5
]$
输出:
105.0
52.5
边界:速度全为 0¶
输入:
0 1 0 1
输出:
0.0
0.0
边界:只有地面行驶¶
输入:
0 0 40 2
输出:
80.0
40.0
7. 提交前检查¶
- 是否用
double读入?不要用int。 - 是否保留一位小数?用
printf("%.1f")或fixed << setprecision(1)。 - 是否输出两行?
- 是否把总时间算成 (b+d)?
- 平均速度是不是总路程除以总时间,而不是两段速度直接平均?
- 题目允许误差 (0.1),保留一位小数一般没问题。
8. 教练总结¶
这题核心就一句话:
总路程 = 高速路程 + 地面路程;平均速度 = 总路程 ÷ 总时间。
注意两点:
- 输入是实数,必须用
double。 - 平均速度不能写成 ((a+c)/2),必须用总路程除以总时间。
代码很短,属于入门送分题。