2-13. 两个有序序列的中位数(25)

来源:互联网 发布:淘宝卖家4.6 编辑:程序博客网 时间:2024/06/05 00:20

2-13. 两个有序序列的中位数(25)

时间限制
120 ms
内存限制
32000 kB
代码长度限制
8000 B
判题程序
Standard

已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0, A1…AN-1的中位数指A(N-1)/2的值,即第[(N+1)/2]个数(A0为第1个数)。

输入格式说明:

输入分3行。第1行给出序列的公共长度N(0<N<=100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。

输出格式说明:

在一行中输出两个输入序列的并集序列的中位数。

样例输入与输出:

序号输入输出1
51 3 5 7 92 3 4 5 6
4
2
6-100 -10 1 1 1 1-50 0 2 3 4 5
1
3
31 2 34 5 6
3
4
34 5 61 2 3
3
5
121
1



#include<stdio.h>#include<vector>using namespace std;vector<int> a1,a2,a3;  //向量a1,a2; 向量3是交集向量int main(){int num,n;int i,j;scanf("%d",&num);for(i=0;i<num;i++){scanf("%d",&n);a1.push_back(n);}for(i=0;i<num;i++){scanf("%d",&n);    a2.push_back(n);}int j1=0,j2=0;int pos=(num*2+1)/2;int count=0; // 用于计数//获得中位数算法, 寻找第(N+1)/2个数while(j1!=num &&  j2!=num) //a1,a2有一个数组到了尽头, 就终止循环{int temp;if(a1[j1]==a2[j2]){count+=2;//printf("%d=%d:%d\n",a1[j1],a2[j2],count);temp=a1[j1];a3.push_back(a1[j1]);j1++;j2++;}else if(a1[j1]<a2[j2]){count++;//printf("%d<%d:%d\n",a1[j1],a2[j2],count);temp=a1[j1];j1++;}else{count++;//printf("%d>%d:%d\n",a1[j1],a2[j2],count);temp=a2[j2];j2++;}if(count>=pos){printf("%d",temp);break;}}return 0;}


0 0