week1-[分支结构]中位数
题目描述
给定 444 个正整数 a,b,c,da,b,c,da,b,c,d,输出它们的中位数,答案四舍五入保留 111 位小数。
输入格式
输入共 111 行 444 个正整数 a,b,c,da,b,c,da,b,c,d。
输出格式
输出共 111 行 111 个浮点数表示答案。
样例 #1
样例输入 #1
3 1 2 7
样例输出 #1
2.5
提示
样例解释 111
(2+3)÷2=2.5(2 + 3) \div 2 = 2.5(2+3)÷2=2.5。
数据范围
对于所有数据,1≤a,b,c,d≤1001\leq a,b,c,d\leq 1001≤a,b,c,d≤100。
week1-[分支结构]中位数 题解
1. 阅读题目
我们有 444 个正整数 a,b,c,da,b,c,da,b,c,d,要求输出它们的中位数,并且结果四舍五入保留 111 位小数。
- 中位数定义:
- 当数据个数为偶数时,中位数 = 中间两个数的平均值。
- 本题有 444 个数,所以中位数 = 排序后第 2 和第 3 个数的平均值。
2. 分析问题
- 步骤:
- 将 444 个数存入数组。
- 排序。
- 取第 2 和第 3 个数的平均值(注意下标)。
- 输出保留 1 位小数(四舍五入)。
- 数据范围很小(1≤a,b,c,d≤1001 \leq a,b,c,d \leq 1001≤a,b,c,d≤100),可以直接用排序解决。
3. 解决方案
- 用
sort
排序数组。 - 平均值用
double
计算,避免整数除法丢失小数。 - 用
fixed
和setprecision(1)
控制保留 1 位小数。
4. C++ 代码实现
#include <bits/stdc++.h>
using namespace std;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);vector<int> nums(4);for (int i = 0; i < 4; i++) cin >> nums[i];sort(nums.begin(), nums.end());double median = (nums[1] + nums[2]) / 2.0;cout << fixed << setprecision(1) << median << "\n";return 0;
}
5. 数据测试
样例 1
输入
3 1 2 7
过程
- 排序后:
1 2 3 7
- 中位数 = (2+3)/2=2.5(2 + 3) / 2 = 2.5(2+3)/2=2.5
输出
2.5
样例 2
输入
10 20 30 40
过程
- 排序后:
10 20 30 40
- 中位数 = (20+30)/2=25.0(20 + 30) / 2 = 25.0(20+30)/2=25.0
输出
25.0
6. 时间复杂度与空间复杂度
- 时间复杂度:O(4log4)≈O(1)O(4\log 4) \approx O(1)O(4log4)≈O(1)
- 空间复杂度:O(4)≈O(1)O(4) \approx O(1)O(4)≈O(1)
7. 优化方案
- 数据量极小,本题已是最优解。
- 如果扩展到 NNN 个数且只求中位数,可以用
nth_element
在 O(N)O(N)O(N) 时间求出中位数,无需完全排序。