EZOJ #224

传送门

分析

首先我们发现要让答案最小,或运算一定是没有用的

我们还可以发现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;
}

猜你喜欢

转载自www.cnblogs.com/yzxverygood/p/10527439.html