1029 Median(25 分)

Given an increasing sequence S of N integers, the median is the number at the middle position. For example, the median of S1 = { 11, 12, 13, 14 } is 12, and the median of S2 = { 9, 10, 15, 16, 17 } is 15. The median of two sequences is defined to be the median of the nondecreasing sequence which contains all the elements of both sequences. For example, the median of S1 and S2 is 13.

Given two increasing sequences of integers, you are asked to find their median.

Input Specification:

Each input file contains one test case. Each case occupies 2 lines, each gives the information of a sequence. For each sequence, the first positive integer N (≤2×10​5​​) is the size of that sequence. Then N integers follow, separated by a space. It is guaranteed that all the integers are in the range of long int.

Output Specification:

For each test case you should output the median of the two given sequences in a line.

Sample Input:

4 11 12 13 14
5 9 10 15 16 17

Sample Output:

13

题目大意:找出两个序列的中位数,需要将两列合在一起找。

//怎样从一堆中找出中位数。应该不能用排序,因为数据量真的很大。

#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<queue>
using namespace std; int main() {
priority_queue<long int> pq;
int m,n;
scanf("%d",&m);
long int t;
for(int i=;i<m;i++){
scanf("%ld",&t);
pq.push(t);
}
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%ld",&t);
pq.push(t);
}
int x=(m+n)/;
for(int i=;i<x;i++){
pq.pop();
}
printf("%ld",pq.top());
return ;
}

//这个代码是取巧用了优先队列,利用它的堆排序的性质,先入队,然后再出队,出到顶端是中位数的情况,在牛客网上通过,但是在pat上有最后4个 测试点是内存超限,那应该就是不行了,不能用优先队列来实现。但是不用的话,我一时想不起来该怎么做。

主要就是空间的问题,不能开两个数组的空间,会内存超限。

代码来自:https://www.liuchuo.net/archives/2248

#include <iostream>
#include <climits>
#include <queue>
#include<stdio.h>
using namespace std;
int main() {
queue<int> a, b;
long long tnum;
int n, m, num, cnt = ;
scanf("%d", &n);
for(int i = ; i < n; i++) {
scanf("%lld", &tnum);
num = min((long long)INT_MAX, tnum);
a.push(num);
}
a.push(INT_MAX);
scanf("%d", &m);
for(int i = ; i < m; i++) {//控制对m个数的读入
scanf("%lld", &tnum);
int num = min((long long)INT_MAX, tnum);
b.push(num);
if(cnt == (n + m - ) / ) {
printf("%d", min(a.front(), b.front()));
return ;
}
if(a.front() < b.front())
a.pop();//这样边入边弹,非常好。就不会内存超限了。
else
b.pop();//每弹出一个cnt就会+1.
cnt++;
}
b.push(INT_MAX);//保证b队列不会空,用
/**
4 11 12 13 14
2 2 3
**///测试
for(; cnt < (n + m - ) / ; cnt++) {
if(a.front() < b.front())
a.pop();
else
b.pop();
}//肯定得有这个for循环,像下面这个样例,
//情况为:当第二队列全部读入时,仍然没有弹出一般的数。
/**
10 11 26 26 29 36 40 67 68 72 82
4 23 30 62 67
**/
printf("%d", min(a.front(), b.front()));
return ;
}

//先读入第一队列中所有的数,

1.INT_MAX在limits.h文件中

2.两个队列最后都放入一个INT_MAX保证非空的比较

3.在遇到大于INT_MAX的时候并不会是最终的结果,使用min函数作为num。

非常厉害,学习了。

PAT 1029 Median[求中位数][难]的更多相关文章

  1. PAT 1029 Median (25分) 有序数组合并与防坑指南

    题目 Given an increasing sequence S of N integers, the median is the number at the middle position. Fo ...

  2. PAT 1029. Median

    尼玛,数组偶数个数的时候取中位数是取中间两者中的前者,还tmd一直再算平均,卧槽 #include <iostream> #include <cstdio> #include ...

  3. PAT 甲级 1029 Median (25 分)(思维题,找两个队列的中位数,没想到)*

    1029 Median (25 分)   Given an increasing sequence S of N integers, the median is the number at the m ...

  4. PAT 甲级 1029 Median

    https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968 Given an increasing se ...

  5. URAL 1306 - Sequence Median 小内存求中位数

    [题意]给出n(1~250000)个数(int以内),求中位数 [题解]一开始直接sort,发现MLE,才发现内存限制1024k,那么就不能开int[250000]的数组了(4*250000=1,00 ...

  6. PAT甲 1029. Median (25) 2016-09-09 23:11 27人阅读 评论(0) 收藏

    1029. Median (25) 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Given an incr ...

  7. 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】

    题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...

  8. HDU 3282 Running Median 动态中位数,可惜数据范围太小

    Running Median Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

随机推荐

  1. Win8交互UX——鼠标交互

    针对触摸输入优化 Window 应用商店应用设计,并在默认情况下获得基本的鼠标支持. 设计和构建用户可以通过鼠标交互的 Windows 应用商店应用. 鼠标输入最适合那些需要精确指向和单击的用户交互. ...

  2. 【cs229-Lecture14】主成分分析法

    本节课内容: 因子分析 ---因子分析中的EM步骤的推导过程 主成份分析:有效地降低维度的方法 因子分析 混合高斯模型的问题 接下来讨论因子分析模型,在介绍因子分析模型之前,先看高斯分布的另一种写法, ...

  3. C和C++书籍推荐

    http://bestcbooks.com/recommend/most-influential-book/ http://www.ruanyifeng.com/blog/2011/09/c_prog ...

  4. Android.mk (2) 函数进阶教程 - 分支、循环、子程序

    https://www.jianshu.com/p/674dc7d7b4b0 函数进阶教程 - 分支.循环.子程序 按照面向过程程序设计的标准流程,我们讲完了顺序结构,就要讲分支.循环和子程序.下面我 ...

  5. Unity3D笔记 英保通十 射线碰撞器检测

    射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...

  6. postgresql----文本搜索类型和检索函数

    postgresql提供两种数据类型用于支持全文检索:tsvector类型产生一个文档(以优化全文检索形式)和tsquery类型用于查询检索. tsvector的值是一个无重复的lexemes排序列表 ...

  7. 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]

    题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...

  8. POJ 2240 - Arbitrage - [bellman-ford求最短路]

    Time Limit: 1000MS Memory Limit: 65536K Description Arbitrage is the use of discrepancies in currenc ...

  9. 【紫书】 The Falling Leaves UVA - 699 递归得简单

    题意:给你一颗二叉树的前序遍历,空子树以-1表示,将左右子树的权值投影到一维数轴上,左儿子位置为根位置-1,右儿子+1求个个整点上的和: 题解:递归,整个过程只需维护一个sum数组. 更新根,更新le ...

  10. SUSE12的虚拟机安装以及ORACLE12C的安装

    在本文中用到的所有参数,均位于文后附录中 在VMware中新建虚拟机,建好之后挂载光盘,启动虚拟机进入安装界面 初始化中 选择跳过注册 选择DVD模式 选择接受许可证条款 默认选择 选择默认系统 选择 ...