呵呵,我开始还用状压…
想看状压解法戳这里,建议看一下哦亲,蛮有帮助,毕竟不是每次思维都这么强
虽然这确实是状压的裸题,不过有更思维的解法
假 设 最 小 的 值 是 s , 因 为 s ∈ [ 0 , 1 < < 9 ] , 所 以 可 以 小 到 大 枚 举 假设最小的值是s,因为s\in[0,1<<9],所以可以小到大枚举 假设最小的值是s,因为s∈[0,1<<9],所以可以小到大枚举
考 虑 如 何 c h e c k 答 案 合 法 考虑如何check答案合法 考虑如何check答案合法
如 果 对 于 每 个 a i , 存 在 一 个 b j 如果对于每个a_i,存在一个b_j 如果对于每个ai,存在一个bj
令 t e m p = ( a i & b j ) 令temp=(a_i\&b_j) 令temp=(ai&bj)
若 ( s ∣ t e m p ) = = s 若(s|temp)==s 若(s∣temp)==s
说明此时的 s s s就是答案
因 为 只 要 取 刚 在 每 个 a i 对 应 的 b j 构 成 的 i 个 t e m p 相 与 运 算 因为只要取刚在每个a_i对应的b_j构成的i个temp相与运算 因为只要取刚在每个ai对应的bj构成的i个temp相与运算
答 案 就 是 这 个 最 小 的 s 了 答案就是这个最小的s了 答案就是这个最小的s了
啥 ? 你 问 我 为 啥 不 能 更 小 ? 因 为 我 们 从 小 到 大 c h e c k 过 来 的 , 前 面 不 能 合 法 啥?你问我为啥不能更小?因为我们从小到大check过来的,前面不能合法 啥?你问我为啥不能更小?因为我们从小到大check过来的,前面不能合法
#include
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;
}
}