トピック:
Kharazi(Callatz)推測の説明は、1001に与えられています。このトピックでは、状況は多少複雑です。
ダブルカウントを避けるために、番号が遭遇した各再帰的に記録することができたとき、私たちはKharaziの推測を検証する場合。例えば、n = 3の場合は、検証のために、我々は、我々は、n = 5,8,4,2を確認する場合、3,5,8,4,2,1を計算する必要がある、それはKharazi推測直接決定することができます検証に遭遇したとき、それは数4 3を持っているので信憑性は、ダブルカウントせずに、我々は数の5,8,4,2 3「報道」と呼ばれています。私たちは、nは、シリーズの他の図でカバーすることができない場合は、「キーの数」の数であるn個の列に番号を呼び出します。
今検証する一連の番号に与えられた、我々は唯一のそれらのいくつかのキー番号を確認する必要がある、あなたは残りの番号を確認するために繰り返されている必要はありません。あなたの仕事は降順に出力することによると、これらのキー数値を見つけることです。
入力フォーマット:
N(1 <n≤100)各テストは、テスト入力を含む正の整数値は、最初の行がKの整数正が与えられる(<100)、2行目は検証する互いにKの別を与えます、数字間のスペースで区切られました。
出力フォーマット:
出力キー数値の順にライン毎の各テストケース出力、。数字の間のスペースで区切られますが、行は、最後の桁のスペースではありません
サンプル入力:
6
3 5 6 7 8 11
出力例:
7 6
アイデア:
核となるアイデアは、条件を満たしていない配列番号を選択することで、そのように、その判定条件としてこれを使用して、配列はKharaziを行っている不適格の数はいくつか存在していたと思う場合は、削除、およびニーズを削除します動的にそのベクトルの容器を使用し、金型に配列を調整する必要性
コード:
#include<iostream>
#include<vector>
#include <algorithm>//包含sort函数,find函数
using namespace std;
int main()
{
int num;
vector <int> vec;
cin>>num;
while(num--)
{
int temp;
cin>>temp;
vec.push_back(temp);
}
vector<int> vec_temp(vec);//声明一个复制的vector,为了删除元素
for(vector<int>::iterator it_temp,it=vec_temp.begin();it!=vec_temp.end();it++)
{
while(*it!=1)
{
if(*it%2==0)
{
*it/=2;
}
else
{
*it=(3*(*it)+1)/2;
}
it_temp=find(vec.begin(),vec.end(),*it);
if(it_temp!=vec.end())
vec.erase(it_temp);
}
}
sort(vec.begin(),vec.end(),greater<int>());
for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
{
cout << *it;
if(it!=vec.end()-1)
cout<<" ";
}
return 0;
}