C. Boboniu and Bit Operations(思维)

呵呵,我开始还用状压…

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

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

s , s [ 0 , 1 < < 9 ] , 假设最小的值是s,因为s\in[0,1<<9],所以可以小到大枚举

c h e c k 考虑如何check答案合法

a i , b j 如果对于每个a_i,存在一个b_j

t e m p = ( a i & b j ) 令temp=(a_i\&b_j)

( s t e m p ) = = s 若(s|temp)==s

说明此时的 s s 就是答案

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

s 答案就是这个最小的s了

? ? c h e c k , 啥?你问我为啥不能更小?因为我们从小到大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;
	}
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107971320