思路:用一个大根堆和一个小根堆,小根堆存排名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;
- }
-
相关阅读:
【Spring Security】安全框架学习(八)
Mac 下 Go 的安装和卸载
【linux】进程控制——1
IDEA如何配置Tomcat
【数据库】聚集函数
2023NOIP A层联测32 红楼 ~ Eastern Dream
机器学习和数据科学的最佳公共数据集机器学习、数据科学、情感分析、计算机视觉、自然语言处理 (NLP)、临床数据等的最佳公共数据集。
P4316 绿豆蛙的归宿 ( 拓扑 + 期望dp
基于流的深度生成模型
vue多张图片实现TV端长图浏览组件
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126393214