20260927 080349 1 2开车旅行

20260927_080349_1_2开车旅行.md

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)

求:

  1. 总路程;
  2. 全程平均速度。

输入:
一行四个实数 (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. 教练总结

这题核心就一句话:

总路程 = 高速路程 + 地面路程;平均速度 = 总路程 ÷ 总时间。

注意两点:

  1. 输入是实数,必须用 double。
  2. 平均速度不能写成 ((a+c)/2),必须用总路程除以总时间。

代码很短,属于入门送分题。