标签:等于 ref 大于 最小值 http 异或 \n ret lan
分析
首先我们发现要让答案最小,或运算一定是没有用的
我们还可以发现a^b = a&(~b)
所以异或运算也没有用
于是我们只考虑否和与
我们还会得到一个性质就是没增加一个数一定会让答案的1的个数至少减少一半
因为我们会让答案与上a和(~a)中是的答案的0的数量增加最多的一个
所以最坏增加剩余1的数量的一半
所以当n大于9时一定使答案为0
于是我们只需要在n小于等于9的时候2^n枚举所有情况去最小值即可
代码
#include<bits/stdc++.h>
using namespace std;
#define int unsigned long long
int n,m,a[1100],now,Ans;
inline void go(int wh){
if(wh==n){
Ans=min(Ans,now);
return;
}
int be=now;
now=be&(a[wh+1]);
go(wh+1);
now=be&(~a[wh+1]);
go(wh+1);
}
signed main(){
int i,j,k;
int t;
cin>>t;
while(t--){
cin>>n;
for(i=1;i<=n;i++)cin>>a[i];
Ans=~(int)0;
if(n>=10)puts("0");
else now=~(int)0,go(0),printf("%llu\n",Ans);
}
return 0;
}
标签:等于 ref 大于 最小值 http 异或 \n ret lan
原文地址:https://www.cnblogs.com/yzxverygood/p/10527439.html