问题描述:
进阶实验1-3.1 两个有序序列的中位数 (25分)
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0 A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A
0为第1个数)。
输入:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出:
在一行中输出两个输入序列的并集序列的中位数。
示例输入1:
5
1 3 5 7 9
2 3 4 5 6
样品输出1:
4
示例输入2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
样品输出2:
1
思路:
这道题就是对两个组数据整合到一起进行排序,然后找排序后的n-1个数输出就行
在这道题中我省事了,用了优先队列! 下面我们来了解一下优先队列
优先队列简单理解就是你可以设置优先级,入队后会根据你的优先级排序,比如说你是小顶堆,刚开始事2 5,输入一个3后会自动变成2 3 5.
头文件 #include<queue>
小顶堆(按非减序排列)
priority_queue<int , vector<int>, greater<int> > q;
大顶堆(按非增序排列)
priority_queue<int, vector<int>, less<int> > q;
具体操作:
q.top() 访问队头元素
q.empty() 队列是否为空
q.size() 返回队列内元素个数
q.push() 插入元素到队尾 (并排序)
q.emplace() 原地构造一个元素并插入队列
q.pop() 弹出队头元素
swap 交换内容
样例代码:
#include<iostream>
#include<queue>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;//小顶堆
priority_queue<int, vector<int>, less<int> > p;//大顶堆
int main(void)
{
int a[5]={3,-1,5,4,-9};
for(int i=0; i<5; i++)
{
q.push(a[i]);
p.push(a[i]);
}
cout<<"升序序列:"<<endl;
for(int i=0; i<5; i++)
{
cout<<q.top()<<" ";
q.pop();//升序输出
}
cout<<endl<<"降序序列:"<<endl;
for(int i=0; i<5; i++)
{
cout<<p.top()<<" ";
p.pop();//降序输出
}
}
题目C++代码
#include<iostream>
#include<queue>
#include<stdlib.h>
using namespace std;
int main(void)
{
priority_queue <int,vector<int>,greater<int> > q;
int n;
cin>>n;
int *a,*b;
a=(int*)malloc(n*sizeof(int));
b=(int*)malloc(n*sizeof(int));
for(int i=0; i<n; i++)
{
cin>>a[i];
q.push(a[i]);
}
for(int i=0; i<n; i++)
{
cin>>b[i];
q.push(b[i]);
}
for(int i=0; i<n-1; i++)
{
q.pop();
}
cout<<q.top()<<endl;
}