码迷,mamicode.com
首页 > 其他好文 > 详细

EZOJ #224

时间:2019-03-14 00:59:11      阅读:245      评论:0      收藏:0      [点我收藏+]

标签:等于   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;
}

EZOJ #224

标签:等于   ref   大于   最小值   http   异或   \n   ret   lan   

原文地址:https://www.cnblogs.com/yzxverygood/p/10527439.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!