7-4 2つの順序付けられたシーケンスの中央値(25ポイント)
同じ長さの2つの非降順シーケンス、S1、S2があるとすると、S1とS2の和集合の中央値を見つける関数を設計します。順序付けられたシーケンスA0、A 1、...、A N-1の中央値は、A(N-1)/ 2の値、つまり、最初の⌊(N + 1)/2⌋番号(A 0が最初の番号です)。
入力フォーマット:
入力は3行に分割されます。最初の行はシーケンスの共通の長さN(0 <N≤100000)を示し、次に各行はシーケンスの情報、つまりN個の整数を降順ではなく入力します。数字はスペースで区切られます。
出力フォーマット:
2つの入力シーケンスの和集合シーケンスの中央値を1行で出力します。
入力例1:
5
1 3 5 7 9
2 3 4 5 6
出力サンプル1:
4
入力例2:
6
-100 -10 1 1 1 1
-50 0 2 3 4 5
出力サンプル2:
1
2つの順序付けられたシーケンスを再配置します(重複を削除せず、中央値を見つけます)。
方法1:最初に入力してから、1つずつ比較して並べ替えます
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<int>a,b,c;
int x;
for(int i=0;i<n;++i)
{
cin>>x;
a.push_back(x);
}
for(int i=0;i<n;++i)
{
cin>>x;
b.push_back(x);
}
int i=0,j=0;
//把二者中小的一方放入数组c
while(!a.empty()&&!b.empty())
{
if(a[i]>b[j])
{
c.push_back(b[j++]);
b.pop_back();
}
else
{
c.push_back(a[i++]);
a.pop_back();
}
}
if(!a.empty())
{
while(!a.empty())
{
c.push_back(a[i++]);
a.pop_back();
}
}
if(!b.empty())
{
while(!b.empty())
{
c.push_back(b[j++]);
b.pop_back();
}
}
int len=(c.size()-2)/2;
cout<<c[len];
return 0;
}
方法1は、中央値であるn-1番目の数値(カウンターの初期値は-1に設定されます)であるサイズを比較するときにカウンターを配置することもできます。
方法2:並べ替えで直接並べ替える
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<int>a;
int x;
for(int i=0;i<2*n;++i)
{
cin>>x;
a.push_back(x); //vector不能直接使用cin>>a[i]; vecor只是声明,没有开辟内存
}
sort(a.begin(),a.end());//对vecotr使用sort排序
cout<<a[n-1];//(2*n-2)/2=n-1
return 0;
}