P1168 中位数[堆 优先队列]
题目描述
给出一个长度为NNN的非负整数序列AiA_iAi,对于所有1≤k≤(N+1)/21 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A1,A3,…,A2k−1A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1的中位数。即前1,3,5,…1,3,5,…1,3,5,…个数的中位数。
输入输出格式
输入格式:
第1行为一个正整数N,表示了序列长度。
第2行包含N个非负整数Ai(Ai≤109)。
输出格式:
共2(N+1)/2行,第iii行为A1,A3,…,A2k−1的中位数。
输入输出样例
7
1 3 5 7 9 11 6
1
3
5
6
说明
对于20%的数据,N≤100;
对于40%的数据,N≤3000;
对于100%的数据,N≤100000。
解析:
解法一:
STL的vector暴力解。
参考代码:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<algorithm>
#define N 100010
using namespace std;
vector<int> a;
int main()
{
int n,x;
cin>>n;
for(int i=;i<n;i++)
{
scanf("%d",&x);
a.insert(upper_bound(a.begin(),a.end(),x),x);
if(i%==) printf("%d\n",a[(i+)/]);
}
return ;
}
解法二:
这里要引入一种堆的新的打开方式:两个堆维护第k大/小的数。
我们用一个大跟堆存放较小值,一个小根堆存放较大值,也就是说,两个堆保持大根堆中的最大值恒比小根堆中的最小值小这样一种性质。
每次动态向两个堆中放入数值时,我们都要维护它的性质,使得它是第k大的值。
求中位数是这个思路的一个变种。
参考代码:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
using namespace std;
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int> > p;
int main()
{
int n,x;
cin>>n;
scanf("%d",&x);
q.push(x);
printf("%d\n",q.top());
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(x<q.top()) q.push(x);
else p.push(x);
while(abs(q.size()-p.size())>)
{
if(q.size()>p.size()){
p.push(q.top());q.pop();
}
else{
q.push(p.top());p.pop();
}
if(i%){
if(q.size()>p.size()) printf("%d\n",q.top());
else printf("%d\n",p.top());
}
}
}
return ;
}
2019-05-26 17:13:43
P1168 中位数[堆 优先队列]的更多相关文章
- [luogu]P1168 中位数[堆]
[luogu]P1168 中位数 题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1 ...
- P1168 中位数 堆
题目描述 给出一个长度为NN的非负整数序列A_iAi,对于所有1 ≤ k ≤ (N + 1) / 21≤k≤(N+1)/2,输出A_1, A_3, …, A_{2k - 1}A1,A3,…,A2 ...
- 洛谷 P1168 中位数(优先队列)
题目链接 https://www.luogu.org/problemnew/show/P1168 解题思路 这个题就是求中位数,但是暴力会tle,所以我们用一种O(nlogn)的算法来实现. 这里用到 ...
- 剑指 Offer 41. 数据流中的中位数 + 堆 + 优先队列
剑指 Offer 41. 数据流中的中位数 Offer_41 题目详情 题解分析 本题使用大根堆和小根堆来解决这个寻找中位数和插入中位数的问题. 其实本题最直接的方法是先对数组进行排序,然后取中位数. ...
- 洛谷——P1168 中位数
P1168 中位数 题目描述 给出一个长度为NN的非负整数序列$A_i$,对于所有1 ≤ k ≤ (N + 1),输出$A_1, A_3, …, A_{2k - 1}A1,A3,…,A2k−1 ...
- P1168 中位数
P1168 中位数树状数组+二分答案.树状数组就是起一个高效查询比二分出来的数小的有几个. #include<iostream> #include<cstdio> #inclu ...
- 【洛谷】【堆】P1168 中位数
[题目描述:] 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. ...
- P1168 中位数(对顶堆)
题意:维护一个序列,两种操作 1.插入一个数 2.输出中位数(若长度为偶数,输出中间两个较小的那个) 对顶堆 维护一个小根堆,一个大根堆,大根堆存1--mid,小根堆存mid+1---n 这样堆顶必有 ...
- P1168 中位数 (优先队列,巧解)
题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], …, A[2k - 1]的中位数.即前1,3,5,……个数的中位数. 输入 ...
随机推荐
- ipad 如何 Airplay 到 Windows 上?
最近刚好有用到这个,觉得还不错,就推荐给大家.虽然个人并不喜欢苹果这一套,但是工作里难免掺杂一些会用到的ipad , mac . 纯粹技术分享. 1. 5KPlayer : https://www.5 ...
- 图解JavaScript闭包面试题
由于最近在学习关于闭包相关的知识,并且闭包这个知识点让我有点搞不太清楚其具体的定义,所以在网上也查阅了很多大佬的讲解和对闭包的一个定义. 最后感觉还是MDN上的说法感觉比较好理解一些,对闭包还是不太理 ...
- Python 环境搭建(Win 安装以及Mac OS 安装)
千里之行始于足下,今天我们先来学习 Python 环境搭建. 注意:本系列教程基于 Python 3.X Python 环境搭建 Win 安装 打开 Python 官网 https://www.pyt ...
- LeetCode 20. 有效的括号(Valid Parentheses)
20. 有效的括号 20. Valid Parentheses 题目描述 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须 ...
- Python中遍历整个列表及注意点(参考书籍Python编程从入门到实践)
1. 利用for循环遍历整个列表 magicians = ['alice', 'dsvid', 'carolina'] # 遍历整个列表 for magician in magicians: prin ...
- django使用pyecharts(5)----django加入echarts_增量更新_定长
五.Django 前后端分离_定时增量更新图表定长数据 1.安装 djangorestframework linux pip3 install djangorestframework windows ...
- youku项目总结(粗略总结)
一.ORM 之前我们都是以文件保存的形式存储数据,这次我们用的是数据库结合python使用,用到 ORM:关系型映射 类>>数据库的一张表 对象>>表一条记录 对象.属性> ...
- Go实战--golang中使用redis(redigo和go-redis/redis)
开源库redigo的使用 github地址: https://github.com/garyburd/redigo 文档地址: http://godoc.org/github.com/garyburd ...
- MySQL DBA的KPI考核指标有哪些
绩效考核是对一名员工所作工作的数量.质量.难度.强度.效率的量化考量.由于DBA的工作性质与纯粹的研发人员或运维人员有所区别,对DBA的KPI考核指标也有其特殊性.参考以往的经验和一些较大的DBA t ...
- Django数据库基本操作(MySQL)
以一个示例工程为例: 下面是工程文件目录: untited为项目文件(一般与根目录同名),CommunityModel为一个定义数据库模型的APP 一.定义模型 1.首先配置好数据库,在untited ...