思路:用一个大根堆和一个小根堆,小根堆存排名m/2+1~m的元素,大根堆存排名1~m/2的元素,
中位数就是大根堆的堆顶元素。
每来一个新的数,如果比中位数小就插入大根堆,不然就插入小根堆。插入完后要保证大根堆的元素个数比小根堆大1。
最后输出中位数。
代码:
- #include
- #include
- #include
- #include
- using namespace std;
- int n;
- priority_queue<int,vector<int>,greater<int>>heap;
- priority_queue<int,vector<int>,less<int>>heap1;
- const int N=1e5+100;
- int a[N];
- int main()
- {
- int t;
- cin>>t;
- for(int j=1;j<=t;j++)
- {
- priority_queue<int,vector<int>,greater<int>>heap;//右半边
- priority_queue<int,vector<int>,less<int>>heap1;//左半边
- int p,n;
- cin>>p>>n;
- for(int i=1;i<=n;i++)
- scanf("%d",&a[i]);
-
- cout<
' '<2+1<
- int cnt=0;
- for(int i=1;i<=n;i++)
- {
- if(heap1.size()&&a[i]<=heap1.top())
- heap1.push(a[i]);
- else if(heap1.size()==0)
- heap1.push(a[i]);
- else if(heap1.size()&&a[i]>heap1.top())
- heap.push(a[i]);
-
- while(heap1.size()<=heap.size())
- {
- heap1.push(heap.top());
- heap.pop();
- }
- while(heap1.size()>=heap.size()+2)
- {
- heap.push(heap1.top());
- heap1.pop();
- }
- if(i%2)
- {
- cnt++;
-
- cout<
top()<<' '; - if(cnt%10==0&&i!=n)
- cout<
- }
- }
- if(j!=t)
- cout<
- }
- return 0;
- }
-
相关阅读:
[附源码]计算机毕业设计JAVA新冠疫苗线上预约系统
代码随想录训练营第28天|LeetCode 93.复原IP地址、78.子集、 90.子集II
私有化轻量级持续集成部署方案--03-部署web服务(下)
硅谷课堂笔记(中)
搭建XSS 测试平台
树莓派系统安装,使用SSD/U盘启动centos
05 面向对象
第一章:最新版零基础学习 PYTHON 教程(第十三节 - Python 语句中的 –Python While 循环)
8.Java数组
MySQL 数据库约束
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126393214