呵呵,我开始还用状压…
想看状压解法戳这里,建议看一下哦亲,蛮有帮助,毕竟不是每次思维都这么强
虽然这确实是状压的裸题,不过有更思维的解法
假设最小的值是s,因为s∈[0,1<<9],所以可以小到大枚举
考虑如何check答案合法
如果对于每个ai,存在一个bj
令temp=(ai&bj)
若(s∣temp)==s
说明此时的
s就是答案
因为只要取刚在每个ai对应的bj构成的i个temp相与运算
答案就是这个最小的s了
啥?你问我为啥不能更小?因为我们从小到大check过来的,前面不能合法
#include <bits/stdc++.h>
using namespace std;
int n,m,a[209],b[209];
bool isok(int s)
{
for(int i=1;i<=n;i++)
{
int flag=0;
for(int j=1;j<=m;j++)
{
int temp= ( a[i]&b[j] );
if( (temp|s)==s ) flag=1;
if( flag ) break;
}
if( flag==0 ) return false;
}
return true;
}
int main()
{
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=m;i++) cin >> b[i];
for(int i=0;i<(1<<9);i++)
if( isok(i) )
{
cout << i;
return 0;
}
}