C. Boboniu and Bit Operations(思维)

呵呵,我开始还用状压…

想看状压解法戳这里,建议看一下哦亲,蛮有帮助,毕竟不是每次思维都这么强

虽然这确实是状压的裸题,不过有更思维的解法

假 设 最 小 的 值 是 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 (stemp)==s

说明此时的 s s s就是答案

因 为 只 要 取 刚 在 每 个 a i 对 应 的 b j 构 成 的 i 个 t e m p 相 与 运 算 因为只要取刚在每个a_i对应的b_j构成的i个temp相与运算 aibjitemp

答 案 就 是 这 个 最 小 的 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;
	}
}

你可能感兴趣的:(div题解)