題目描述
作爲白玉樓的庭師,妖夢雖然不會n刀流,但是卻領悟了生命二刀流。然而我也是個劍的收藏者,家裏屯着n把劍,每一把劍都有一個靈魂值a[i],由於一些劍之間可能有共鳴,所以我需要兩把契合度最高的劍。據妖夢所說,兩把編號爲i,j劍的契合度爲a[i] and a[j]。如何深得劍的靈魂呢?(即求最大值)
輸入
第一行一個整數n,代表藏劍數。
第二行n個整數,第i個整數表示a[i]。
輸出
輸出包含一個正整數,最好的兩把劍的契合度。
樣例輸入
5
12 5 6 3 1
樣例輸出
4
樣例輸出
對於40%的數據 n ≤ 1,000
對於100%的數據 n ≤ 1,000,000,0 ≤ a[i] < 2^31
題解:首先,a and b——a&b(二進制相同位處同一則一,其他爲0);
解法採用篩選加組成方式,a[i]不超過2^31,所以從31開始向下遍歷,以此來尋找二進制位數最高的結果;
先對輸入的數進行從大到小排列,再進行循環,每次循環時比對數據是否符合要求,即該數是否與已有的結果在而進制位上有相同的1,並且該數的i-1二進制位上是否有1,如果都滿足,則累計,當數組內所有數遍歷完後,如果累加大於等於二則在已有結果的二進制的下一位變成1.
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int b)
{
return x>b;
}
int a[1000005];
int main()
{
int n,i,sum=0,j,b[100];
cin>>n;
for(i=0; i<78; i++)
{
b[i]=i;
}
for(i=0; i<n; i++)
{
cin>>a[i];
}
sort(a,a+n,cmp);
for(i=31; i>=1; i--)
{
int x=0;
for(j=0; j<n; j++)
{
if(((sum&a[j])==sum)&&((a[j]&(1<<(i-1)))!=0))//對二進制位變1的要求
{
x++;
}
}
if(x>=2)//如果有兩個以上的數據符合要求則變1
{
sum+=(1<<(i-1));
}
}
cout<<sum<<endl;
}