Codeforces #664 C Boboniu and Bit Operations

传送门

题意

数组a和b,问1<=a<=n,1<=j<=m,将所有的ci=a[i]&b[j]取或的最小值为多少,i每个只取一次,j每个可以取任意次。

思路

暴力枚举,可以先把答案ans置为2^9-1,然后枚举每一数位上的1,看置为0后是否有满足的c数组存在,如果存在即合理。注意是要从高数位开始枚举,因为低位开始枚举的话,不能保证答案是最小值

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
#define maxn 100005
#define mod 998244353
int a[202],b[202],c[202],n,m,ans;

bool jud(int x){
    for(int i=1;i<=n;i++){
        bool flag=false;
        for(int j=1;j<=m;j++){
            if(((a[i]&b[j])|x)==x){
                flag=true;
                break;
            }
        }
        if(!flag) return false;
    }
    return true;
}

int main(){
    int i, j, k, t;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++) scanf("%d",&a[i]);
    for(i=1;i<=m;i++) scanf("%d",&b[i]);
    int ans=(1<<10)-1;
    for(i=9;i>=0;i--)
        if(jud(ans^(1<<i))) ans^=(1<<i);
    printf("%d\n",ans);
}
阅读全文 »