题意:给定两个长度分别为n,m(2<=m,n<=200)的序列{a1,a2,…an}、{b1,b2…bm}(0<=ai,bi<2^9)。定义序列{c1,c2,…,cn},其中ci=ai&bj(j可以取1~m任意一个),求min(c1 | c2 | … |cn)。
题解:由于ai,bi的范围很小,答案的范围是【0,512),可以考虑暴力求解,将答案ans=0,1,…,511枚举过程中,利用
res=c1|c2|…|cn,则有res | ci==res,因此在枚举res的过程中,只需再稍加判断能否保证res|ci=res即可,若满足,则此res就是答案。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[205],b[205];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
for(int i=0;i<512;i++) //直接枚举结果
{
bool f=true;
for(int j=0;j<n;j++)
{
f= false;
for(int k=0;k<m;k++)
{
if(((a[j]&b[k])|i)==i)
{
f=true;
break;
}
}
//一旦有一个a_i找不得相匹配的b_j,就直接break
if(f==false)
break;
}
if(f==true)//这里只有当所有的a_i都找到了相匹配的b_j才可到达
{
cout<<i<<endl;
break;
}
}
}