130℃(ビット演算) - アヌは機能CodeForcesを持っています

アヌは、彼女自身の機能FFを作成しました:F(X、Y)=(X | Y)-yf(X、Y)=(X | Y)-y || ビット単位のOR演算を示します。例えば、F(11,6)=(11 | 6)-6 = 15-6 = 9F(11,6)=(11 | 6)-6 = 15-6 = 9。任意の非負の数がxxをおよびFのYY値(X、Y)は、f(x、y)はまた、非負であることを証明することができます。

彼女は、この関数の詳細を研究したいと自分のために複数の問題を作成しました。しかし、彼女はそれらのすべてを解決することができず、あなたの助けを必要とします。ここでは、これらの問題の一つです。

配列の値は[A1、A2、...、] [A1、A2、...、]は、F(F(... F(F(A1、A2)、A3のように定義される)、...-1)、 )、F(F(... F(F(A1、A2)、A3)、...-1)、)(注を参照)。あなたは必ずしも区別できない要素を持つ配列を与えています。配列の値が可能極大となるように、どのようにその要素の順序を変更する必要がありますか?

入力
最初の行は、単一の整数NN(1≤n≤1051≤n≤105)を含みます。

2行目はNN整数A1、A2、...、ANA1、A2、...、(0≤ai≤1090≤ai≤109)が含まれています。配列の要素は異なることが保証されていません。

出力
整数NN出力、最大値を持つ配列の並べ替え。複数回答がある場合は、いずれかを印刷してください。

例として
、入力
4
4 0 11 6
の出力
11 6 4 0
入力
1
13
の出力
13

最初のテストケースでは、配列の値[11,6,4,0] [11,6,4,0]は、F(F(ありますF(11,6)、4)、0)= F(F(9,4)、0)= F(9,0)= 9F(F(F(11,6)、4)、0)= F (F(9,4)、0)= F(9,0)= 9。

[11,4,0​​,6] [11,4,0​​,6]もある有効な回答。
見つけることができるテーブルを演奏した後、F(X、Y)= (X | Y)-y = X&(〜Y )、この形式で書くことができます。
我々は、X1&(〜×2)&(見つけに行ってきましたので 〜X3)&...&(〜XN) 最大最適なソート順を。
それ以来用途は依頼するコンピューティングのバイナリビットに変換されます。上記の式は、実際には、最終的な結果は、最初の桁によって決定される、ことを見出すことができる観察します。ビット上の唯一の数はこの1つ上の他の数字が全て0であるながら、最終的な結果であるので、次に、数1は、最初の場所に配置され、1である場合、その特定の1(休息このビットが1)で否定後数。私たちは、その後、ちょうどそのような数字、最初の場所でこれらの構成デジタル、そしてちょうどそれを置く残りを見つけ、この下降の桁数に来ました。
コードは以下の通りであります:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=1e5+100;
int a[maxx];
int n;

inline int fcs()
{
	for(int i=30;i>=0;i--)
	{
		int cnt=0;int pos;
		for(int j=1;j<=n;j++)
		{
			if((a[j]&(1<<i))) cnt++,pos=j;
		}
		if(cnt==1) return pos;//找到这样的一种数字
	}
	return 0;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	int pos=fcs();
	if(pos==0) for(int i=1;i<=n;i++) cout<<a[i]<<" ";
	else 
	{
		cout<<a[pos]<<" ";
		for(int i=1;i<=n;i++)
		{
			if(i!=pos) cout<<a[i]<<" ";
		}
	}
	cout<<endl;
	return 0;
}

ああを給油する、(O)/〜

公開された414元の記事 ウォン称賛23 ビュー30000 +

おすすめ

転載: blog.csdn.net/starlet_kiss/article/details/104261083