題意:
給你一些數, 找一個數x, 使得與所有數的亦或最大的那個值 最小 x
思路:
亦或的話, 肯定是位數是從大到小來枚舉, 如果所有的數中,當前位上的值是一樣的,那麼 x 在這個位上就一定是 0, 如果這個位既有0也有1, 那麼就要分兩種情況來考慮,填 1 會怎麼樣, 填 0 會怎麼樣,然後把數分成兩撥,一波是當前位是1 的, 一波是當前位是0的。 然後不斷遞歸下去。 所以dfs 轉移的時候,還是要用 vector 記錄當前狀態下有什麼樣的數字。
反思:
一開始做的時候, 想到了這種算法, 但是覺得時間複雜度過不去, 就沒有寫,當我看了別人寫的, 我還是沒有懂時間複雜度是怎麼算的。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+100;
int n,x;
vector<int> v;
int dfs(vector<int> v, int bit){
if (v.size() == 0 || bit < 0) return 0;
vector<int>v0, v1;
for (auto it: v){
if ((it >> bit) & 1) v1.push_back(it); else v0.push_back(it);
}
if (v0.size() == 0) return dfs(v1, bit-1);
if (v1.size() == 0) return dfs(v0, bit - 1);
return min(dfs(v0, bit - 1), dfs(v1, bit - 1)) + (1 << bit);
};
int main(){
scanf("%d",&n);
for (int i =0; i < n; ++i){
scanf("%d",&x);
v.push_back(x);
}
int ans = dfs(v, 30);
printf("%d\n",ans);
return 0;
}