《P1168 中位数》
题目描述
给定一个长度为 N 的非负整数序列 A,对于前奇数项求中位数。
输入格式
第一行一个正整数 N。
第二行 N 个正整数 A1…N。
输出格式
共 ⌊2N+1⌋ 行,第 i 行为 A1…2i−1 的中位数。
输入输出样例
输入 #1复制
7 1 3 5 7 9 11 6
输出 #1复制
1 3 5 6
输入 #2复制
7 3 1 5 9 8 7 6
输出 #2复制
3 3 5 6
说明/提示
对于 20% 的数据,N≤100;
对于 40% 的数据,N≤3000;
对于 100% 的数据,1≤N≤100000,0≤Ai≤109。
代码实现:
#include <bits/stdc++.h>
using namespace std;
int main() {
// 存储动态输入并保持有序的数组
vector<int> sortedNums;
int totalCount; // 表示要输入的数字总个数
cin >> totalCount;
for (int i = 1; i <= totalCount; ++i) {
int currentNum; // 存储当前输入的数字
scanf("%d", ¤tNum);
// 利用二分查找找到插入位置,保持数组有序
auto insertPos = upper_bound(sortedNums.begin(), sortedNums.end(), currentNum);
sortedNums.insert(insertPos, currentNum);
// 当处理到奇数个数字时,输出当前的中位数
if (i % 2 == 1) {
// 中位数索引为 (已处理数字个数 - 1) / 2
int medianIndex = (i - 1) / 2;
printf("%d\n", sortedNums[medianIndex]);
}
}
return 0;
}