1029中央値(25ポイント)

アイデア:

中央値の位置を計算し、2つの配列を比較して中央値を取得します。時間計算量はO(n + m)です。

1029中央値(25ポイント)

N個の整数のシーケンスSが増加すると、中央値は中央の位置の数値になります。たとえば、S1 = {11、12、13、14}の中央値は12であり、S2 = {9、10、15、16、17}の中央値は15です。2つのシーケンスの中央値は次のように定義されます。両方のシーケンスのすべての要素を含む非減少シーケンスの中央値。たとえば、S1とS2の中央値は13です。

整数の2つの増加するシーケンスが与えられると、それらの中央値を見つけるように求められます。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各ケースは2行を占め、それぞれがシーケンスの情報を提供します。各シーケンスについて、最初の正の整数N(≤2×10 5)はそのシーケンスのサイズです。次に、スペースで区切られたN個の整数が続きます。すべての整数の範囲であることが保証されている long int型

出力仕様:

テストケースごとに、指定された2つのシーケンスの中央値を1行で出力する必要があります。

サンプル入力:

4 11 12 13 14
5 9 10 15 16 17

サンプル出力:

13

例:

#include<iostream>
#include<vector>
using namespace std;

vector<long> *input(void)
{
    int N;
    cin >> N;
    vector<long> *p = new vector<long>(N);
    for(int i = 0; i < N; i++) cin >> (*p)[i];
    return p;
}

int main()
{
    vector<long> *L1 = input();
    vector<long> *L2 = input();
    int m, i, j, mean = ( L1->size() + L2->size()+1) / 2;
    for(i = 0, j = 0; i < L1->size() && j < L2->size() && mean; mean--)
        if((*L1)[i] <= (*L2)[j]) m = (*L1)[i++];
        else m = (*L2)[j++];
    if(mean)
        if(i == L1->size()) m = (*L2)[j+mean-1];
        else m = (*L1)[i+mean-1];
    cout << m << endl;
}

 

おすすめ

転載: blog.csdn.net/u012571715/article/details/114111236