庭師的利刃

題目描述

作爲白玉樓的庭師,妖夢雖然不會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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章