任务描述
本关任务:一个长度为L(L≥1)的升序序列S,处在第L/2(若为小数则去掉小数后加1)个位置的数称为S的中位数。例如,若序列S1=(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试实现一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
编程要求
输入
多组数据,每组数据有三行,第一行为序列的长度n,第二行为序列A的n个元素,第三行为序列B的n个元素(元素之间用空格分隔)。当n=0时输入结束。
输出
对于每组数据分别输出两个序列的中位数,占一行。
测试说明
平台会对你编写的代码进行测试:
测试输入:
5
11 13 15 17 19
2 4 6 8 20
6
1 2 3 4 5 6
7 8 9 10 11 12
0
预期输出:
11
6
#include <iostream>
using namespace std;
void Input(int a[],int n)
{//读入序列
for(int i=0;i<n;i++)
cin>>a[i];
}
int Search_Mid(int A[],int B[],int n)
{//求解两个升序序列的中位数
int L1=0,R1=n-1,L2=0,R2=n-1;
while(L1<R1&&L2<R2)
{
int mida=(L1+R1)/2;
int midb=(L2+R2)/2;
if(A[mida]==B[midb])
{
return A[mida];
}
if(A[mida]<B[midb])
{
if((R1-L1)%2==0)
L1=mida;
else
L1=mida+1;
R2=midb;
}
else
{
if((R2-L2)%2==0)
L2=midb;
else
L2=midb+1;
R1=mida;
}
}
if(A[L1]<B[L2])
return A[L1];
else
return B[L2];
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
int A[n],B[n];
Input(A,n);
Input(B,n);
cout<<Search_Mid(A,B,n)<<endl;
}
return 0;
}