题目大意:n个数,任意整数x对这n个数取异或值,然后使最大值最小。
思路:数据范围最大为pow(2,30);所以考虑二进制的话,最多有30位。对于某一位d,然后考虑数组v中每一个元素的d为是0还是1,将为0的元素放到数组v0中,将为1的元素放到数组v1中。如果v0中的元素个数为0,那么说明这一位置上的元素全为1,所以我们贪心地希望x在该位置上的为1,对于V1同理.如果说v1和v0都不等于0,那么说明x在该位置与其他元素做异或运算,肯定会有1,所以答案为为两种情况的最小值+1<<d.
ACcode:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll N=1E5+7; ll arr[N]; vector<ll >ve; ll dfs(ll d,vector<ll >v){ if(d<0||v.size()==0) return 0; vector<ll >v1,v0; for(ll i=0;i<v.size();i++){ if((v[i]>>d)&1){ v1.push_back(v[i]); } else v0.push_back(v[i]); } if(v1.size()==0) return dfs(d-1,v0); else if(v0.size()==0) return dfs(d-1,v1); else return min(dfs(d-1,v0),dfs(d-1,v1))+(1<<d); } int main(){ ll n; cin>>n; for(ll i=1;i<=n;i++){ cin>>arr[i]; ve.push_back(arr[i]); } cout<<dfs(30,ve)<<endl; return 0; }