1029 Median (25 分)
题意
给出两个已经递增的序列S1和S2,长度分别为N和M,求将它们合并成一个新的递增序列后的中位数(个数为偶数时为左半部分的最后一个数)。
思路
- 由于在给定两个子序列的长度N和M后,新序列的长度N+M就是已知的,因此中位数的位置为(N+M-1)/2(此处为向下取整)。
- 令计数器count初始为0,表示当前已经获取到的新序列的位数。令两个下标i和j从两个序列的首位开始,不断比较S1[i]和S2[j]的大小:
- 如果S1[i] < S2[j],说明新序列的当前位应为S1[i],因此令i加1。
- 否则,说明新序列的当前位应为S2[j],因此令j加1。
按上面的步骤每确定一个当前最小的数,就令count加1,直到count增长到中位数的位置(N+M-1)/2时才停止。此时,S1[i]和S2[j]中的较小值即为所求的中位数。
const int N=2e5+10;
int a[N],b[N];
int c[N<<1];
int n,m;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
cin>>m;
for(int i=0;i<m;i++) cin>>b[i];
int i=0,j=0;
int cnt=0;
while(i<n && j<m)
if(a[i] < b[j]) c[cnt++]=a[i++];
else c[cnt++]=b[j++];
while(i<n) c[cnt++]=a[i++];
while(j<m) c[cnt++]=b[j++];
cout<<c[(n+m-1)/2]<<endl;
//system("pause");
return 0;
}