题意:对于一个数组,求一个数字与数组每个元素异或之后的最大值最小,求这个最大值
又是位运算,,题目给出数组元素范围在2^30以内,二进制最多30位,从最高位开始贪心,如果此位置的数组元素有的是1有的是0,最后肯定取1,否则取0,还有就是分组讨论,因为每个bit位只能满足原数组中一部分元素异或后为1
#define int ll vector<int>a; int solve(vector<int>v,int bit) { if(bit<=0||v.size()==0) return 0; vector<int>zero,one; rep(i,v.size()) { if((v[i]>>bit)&1) zero.push_back(v[i]); else one.push_back(v[i]); } if(zero.size()==0) return solve(one,bit-1); if(one.size()==0) return solve(zero,bit-1); return (min(solve(one,bit-1),solve(zero,bit-1))|1<<bit); } signed main() { int n;cin>>n; a.resize(n);cin>>a; cout<<solve(a,30)<<endl; return 0; }
来源:https://www.cnblogs.com/Herlo/p/12179762.html