CSU 1216(異或最大值)

2021-07-09 02:24:27 字數 1486 閱讀 7400

csu_1216

題目簡述:

經典題目,求乙個陣列中兩個數異或運算的最大值。題目極其簡單,但是要求的複雜度需要達到o(n * log(n)),還是比較難的。

解題思路:

總的思路就是構建一棵0-1字典樹,然後乙個數讓查詢乙個與其異或結果最大的數的效率達到o(log(n)),這裡因為異或的特殊性質,可以使用貪心法則來實現。

1、0-1字典樹:

這裡其實是就是二叉樹,之所以叫做字典樹是因為我們的演算法把乙個數當成了乙個31位的字串來看,比如1就是三十個零外加乙個一,這一部分還是比較簡單的。

2、貪心找最大異或值:

異或運算有乙個性質,就是對應位不一樣為1,我們要讓結果最大化,就要讓越高的位置為1。我們找跟乙個數的異或結果最大的數,就從樹的根結點(最高位)開始找,如果對應位置這個數是0,優先去找那一位為1的數,找不到才去找0;如果對應位置這個數是1,優先去找那一位為0的數,找不到才去找0;最終找到的數就是跟這個數異或結果最大的數。n個數,每個數找乙個這樣的數並算出結果求其中的最大值,可以得到答案。

**:

#include 

#include

#include

#include

using namespace std;

int n,a[100005],tmp[35];

struct node

};node *head = null;

void cal(int num)

for(int i=0;i<15;i++)

swap(tmp[i],tmp[30-i]);

}void insert(node* &head, int

index, int &num)

if(tmp[index+1]==0 && !head->left)

head->left = new node(-1);

if(tmp[index+1]==1 && !head->right)

head->right = new node(-1);

if(tmp[index+1]==0)

insert(head->left,index+1,num);

if(tmp[index+1]==1)

insert(head->right,index+1,num);

}int dfs(node* &head,int

index)else

}elseelse

}}int main()

int ans=0;

for(int i=0;i1));

}printf("%d\n",ans);

}return

0;}

總結:

簡單的資料結構用得好可以做很多很奇妙的事情,貪心不能忘啊!

csu 1216 異或最大值

time limit 2 sec memory limit 128 mb submitted 836 solved 300 給定一些數,求這些數中兩個數的異或值最大的那個值 多組資料。第一行為數字個數n,1 n 10 5。接下來n行每行乙個32位有符號非負整數。任意兩數最大異或值 337 9 14 ...

CSU 1216 異或最大值

題目簡述 經典題目,求乙個陣列中兩個數異或運算的最大值。題目極其簡單,但是要求的複雜度需要達到o n log n 還是比較難的。解題思路 總的思路就是構建一棵0 1字典樹,然後乙個數讓查詢乙個與其異或結果最大的數的效率達到o log n 這裡因為異或的特殊性質,可以使用貪心法則來實現。1 0 1字典...

CSU 1216 異或最大值

給定一些數,求這些數中兩個數的異或值最大的那個值 多組資料。第一行為數字個數n,1 n 10 5。接下來n行每行乙個32位有符號非負整數。任意兩數最大異或值 337 9 14 1 include 2 include 3 include 4 include 5 include 6 include 7 ...