思路:用一个大根堆和一个小根堆,小根堆存排名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;
- }
-
相关阅读:
一个Entity Framework Core的性能优化案例
etcd使用与原理【22Fa】
CONV1D卷积神经网络运算过程(举例:n行3列➡n行6列)
k8s如何部署kubernetes-dashboard
怎么做加密文件二维码?简单技巧快速做二维码
web监听器解析
STM32CubeMX systick bug?
论文阅读: A Unified Sequence Interface for Vision Tasks
Javaweb学生信息管理系统(Mysql+JSP+MVC+CSS)
手电筒UL1576测试报告申请流程亚马逊审核
-
原文地址:https://blog.csdn.net/m0_62327332/article/details/126393214