7-4 2つの順序付けられたシーケンスの中央値(25ポイント)

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;
}

 

おすすめ

転載: blog.csdn.net/weixin_43863618/article/details/105935760