zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    重复的listen port引发的问题
    Win10开始运行不保存历史记录原因和解决方法
    意识到const版本函数的重要性
    人物访谈1
    人物访谈2
    读《浪潮之巅》有感
    测试作业
    读《活出生命的意义》有感
    价值观作业
    关于C语言的问卷调查
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14418789.html
Copyright © 2011-2022 走看看