PAT 1029 Median[求中位数][难]
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×105) 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[求中位数][难]的更多相关文章
- PAT 1029 Median (25分) 有序数组合并与防坑指南
题目 Given an increasing sequence S of N integers, the median is the number at the middle position. Fo ...
- PAT 1029. Median
尼玛,数组偶数个数的时候取中位数是取中间两者中的前者,还tmd一直再算平均,卧槽 #include <iostream> #include <cstdio> #include ...
- PAT 甲级 1029 Median (25 分)(思维题,找两个队列的中位数,没想到)*
1029 Median (25 分) Given an increasing sequence S of N integers, the median is the number at the m ...
- PAT 甲级 1029 Median
https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968 Given an increasing se ...
- URAL 1306 - Sequence Median 小内存求中位数
[题意]给出n(1~250000)个数(int以内),求中位数 [题解]一开始直接sort,发现MLE,才发现内存限制1024k,那么就不能开int[250000]的数组了(4*250000=1,00 ...
- 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 ...
- 1005E1 Median on Segments (Permutations Edition) 【思维+无序数组求中位数】
题目:戳这里 百度之星初赛原题:戳这里 题意:n个不同的数,求中位数为m的区间有多少个. 解题思路: 此题的中位数就是个数为奇数的数组中,小于m的数和大于m的数一样多,个数为偶数的数组中,小于m的数比 ...
- HDU 3282 Running Median 动态中位数,可惜数据范围太小
Running Median Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)
题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...
随机推荐
- kafka---->kafka的使用(一)
今天我们来学习一下kafka的简单的使用与配置.世上有可以挽回的和不可挽回的事,而时间经过就是一种不可挽回的事. kafka的安装配置 一.kafka的使用场景 活动跟踪:网站用户与前端应用程序发生交 ...
- css - 文字元素等的美化效果代码汇总(更新中...)
投影的设置 -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparen ...
- MFC控件CTabCtrl关联变量
1.先建立一个对话框MFC应用程序,然后在工具箱里面把Tab Control控件放到对话框中的合适位置上. 再在对话框类中,将该控件绑定一个变量 用两种方法: 1 ) 自己定义成员变量 CTabCtr ...
- URI Scheme注册伪协议实现远程命令执行
Windows配置注册表注册伪协议 1.新建伪协议项 WIN+R 输入regedit 打开注册表,在注册表HKEY_CLASSES_ROOT键中新建一个项,项的名字就是你伪协议的名字,例如我注册一个c ...
- stdarg.h头文件源代码分析
谈到C语言中可变参数函数的实现(参见C语言中可变参数函数实现原理),有一个头文件不得不谈,那就是stdarg.h 本文从minix源码中的stdarg.h头文件入手进行分析: #ifndef _STD ...
- 从Java代码到字节码(1)
理解Java代码是如何被编译为字节码并在Java虚拟机(JVM)上执行是非常重要的,这将帮助理解你的程序是如何执行的.这样的理解不仅仅能够让你在逻辑上更好的掌握语言特性,而且能够有机会理解在做出重要决 ...
- ftok函数
ftok函数 系统建立IPC通讯(消息队列.信号量和共享内存)时必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型 头文件: #include <sys/types.h ...
- jquery给动态添加的dom元素绑定事件
$('input').click(function () { //处理代码 }); 这只能是对已经加载好的元素定义事件,那些后来添加插入的元素则需要另行绑定,对于页面中动态添加的元素,在页面加载完成后 ...
- IIS 下载文件 报错“401 - 未授权: 由于凭据无效,访问被拒绝。”
点开身份验证 改为启用就OK了 重启一下IIS. 如果你上在办法没有解决可参考 1.打开“IIS信息服务管理器”——>选择你发布的网站——>选择功能视图中的“身份验证”——>右键匿名 ...
- hdu3065 病毒侵袭持续中【AC自动机】
病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...