【洛谷 1168】中位数
来源:互联网 发布:linux 安装不了vnc 编辑:程序博客网 时间:2024/06/06 03:13
题目描述
给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数。[color=red]即[/color]前1,3,5,……个数的中位数。
输入输出格式
输入格式:输入文件median.in的第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数A[i] (A[i] ≤ 10^9)。
输出格式:输出文件median.out包含(N + 1) / 2行,第i行为A[1], A[2], …, A[2i – 1]的中位数。
输入输出样例
输入样例#1:
71 3 5 7 9 11 6
输出样例#1:
1356
说明
对于20%的数据,N ≤ 100;
对于40%的数据,N ≤ 3000;
对于100%的数据,N ≤ 100000。
题解:维护一个大根堆和一个小根堆,大根堆里的元素个数总是与小根堆元素的个数相等或少一个,相当于把序列平分成两半,中位数每次取小根堆的第一个元素即可。
每次维护两个堆,具体操作如下:
当两堆的元素个数不相等时,一定向大根堆里面加元素,考虑两种情况:
如果要加入的元素的值>小根堆的堆顶元素,把小根堆的堆顶元素删除,并插入到大根堆中,最后把要插入的元素插入到小根堆中
如果要加入的元素的值<小根堆的堆顶元素,把要插入的元素插入到大根堆中
当两堆的元素个数相等时,情况类似,总之要保证大根堆里面所有的元素都小于小根堆里面任意一个元素。
#include <bits/stdc++.h>using namespace std;const int maxn = 100010;int a1[maxn];int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i ++) scanf("%d", &a1[i]); priority_queue <int> q1; priority_queue <int, vector<int>, greater<int> > q2; int size1 = 0, size2 = 1; q2.push(a1[1]); for(int i = 2; i <= n+1; i ++){ if(!(i&1))printf("%d\n", q2.top()); if(i > n) break; if(size2 > size1){ if(a1[i] > q2.top()){ q1.push(q2.top()), size1 ++; q2.pop(); q2.push(a1[i]); }else q1.push(a1[i]), size1 ++; }else{ if(a1[i] < q1.top()){ q2.push(q1.top()), size2 ++; q1.pop(); q1.push(a1[i]); }else q2.push(a1[i]), size2 ++; } } return 0;}
1 0
- 【洛谷 1168】中位数
- 洛谷 1168 中位数
- 洛谷 中位数
- |洛谷|堆|P1168 中位数
- 洛谷 P1168 中位数
- 洛谷 P1168 中位数
- 洛谷P1168 中位数
- 【洛谷】P1627 中位数
- 洛谷P1168 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- 中位数
- tomcat 配置jmx远程监控
- 性能测试结果分析
- Xml解析
- java设计模式进阶_interpreter
- MyEclipse10手动安装Jad反编译
- 【洛谷 1168】中位数
- Activity 和 Fragment 生命周期 图形说明
- 邻接表 图的存储结构
- AsyncTask的使用方法和理解
- mysql中,无法插入,报dulplicate entry
- Composer创建发布自已的包
- maxscale实现读写分离
- C 输入输出
- spring整合quartz实现简单的任务调度