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(4log?4)≈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) 時間求出中位數,無需完全排序。