5 条题解
-
0
#include <queue> #include <vector> using namespace std; // 定义比较函数,用于创建最小堆(因为priority_queue默认是最大堆) struct CompareMinHeap { bool operator()(int a, int b) { return a > b; // 小顶堆:如果a > b,则a的优先级更低,会被放到后面 } }; // 按格式打印中位数序列 void printMedians(const vector<int>& medians, int count) { int index = 0; // 当前输出的中位数索引 // 按每行10个的格式输出 while (index < count) { for (int i = 0; i < 10 && index < count; ++i, ++index) { cout << medians[index] << " "; // 输出当前中位数 } cout << endl; // 换行 } } int main() { int P; // 数据集个数 cin >> P; // 处理每个数据集 for (int p = 0; p < P; ++p) { int datasetNumber; // 数据集编号 int M; // 数据集中元素个数 // 读取数据集编号和元素个数 cin >> datasetNumber >> M; vector<int> numbers; // 存储当前数据集的所有数字 // 直接读取M个整数 for (int i = 0; i < M; ++i) { int num; cin >> num; numbers.push_back(num); } priority_queue<int> max_heap; // 最大堆(存储较小的一半元素) priority_queue<int, vector<int>, CompareMinHeap> min_heap; // 最小堆(存储较大的一半元素) vector<int> medians; // 存储中位数结果 // 遍历所有数字,动态维护中位数 for (int i = 0; i < numbers.size(); ++i) { int num = numbers[i]; // 当前处理的数字 // 将数字插入合适的堆中 if (max_heap.empty() || num <= max_heap.top()) { max_heap.push(num); // 插入最大堆(较小的一半) } else { min_heap.push(num); // 插入最小堆(较大的一半) } // 调整堆的大小,保持平衡 // 平衡条件:max_heap的大小最多比min_heap大1,或两者相等 if (max_heap.size() > min_heap.size() + 1) { // 如果max_heap太大,将堆顶元素移到min_heap min_heap.push(max_heap.top()); max_heap.pop(); } else if (min_heap.size() > max_heap.size()) { // 如果min_heap太大,将堆顶元素移到max_heap max_heap.push(min_heap.top()); min_heap.pop(); } // 当已处理的数字个数为奇数时,计算并存储中位数 if ((i + 1) % 2 == 1) { if (max_heap.size() > min_heap.size()) { medians.push_back(max_heap.top()); // 中位数在max_heap的堆顶 } else { medians.push_back(min_heap.top()); // 中位数在min_heap的堆顶 } } } // 输出结果 cout << datasetNumber << " " << medians.size() << endl; // 数据集编号和中位数个数 printMedians(medians, medians.size()); // 按格式打印中位数序列 } return 0; }
信息
- ID
- 18
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 235
- 已通过
- 123
- 上传者