1029 Median (25 分)

题意

给出两个已经递增的序列S1和S2,长度分别为N和M,求将它们合并成一个新的递增序列后的中位数(个数为偶数时为左半部分的最后一个数)。

思路

  1. 由于在给定两个子序列的长度N和M后,新序列的长度N+M就是已知的,因此中位数的位置为(N+M-1)/2(此处为向下取整)。
  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;
}
posted @ 2021-02-19 23:50  Dazzling!  阅读(29)  评论(0编辑  收藏  举报