C. Boboniu and Bit Operations(暴力+枚举)

Problem - 1395C - Codeforces

波波尼奥喜欢位操作。他想和你玩一个游戏。

Boboniu给你两个非负整数序列a1,a2,...,an和b1,b2,...,bm。

对于每一个i(1≤i≤n),要求你选择一个j(1≤j≤m),并让ci=ai&bj,其中&表示位和操作。注意,你可以为不同的i选择相同的j。

找出最小可能的c1|c2|...|cn,其中|表示位向OR操作。

输入
第一行包含两个整数n和m(1≤n,m≤200)。

下一行包含n个整数a1,a2,...,an(0≤ai<29)。

下一行包含m个整数b1,b2,...,bm(0≤bi<29)。

输出
打印一个整数:最小可能的c1|c2|...|cn。

题解:
我们发现m,n和整数大小都不大,我们可以暴力从小到大枚举0~2^9,如果一旦又符合的直接输出即可

那么怎么判断符不符合呢?

c1|c2|...|cn我们设为c

根据或(|)的性质我们可以知道

c|任何一个(c1~cn)一定等于他本身

而ci = ai & bj

只要对于每个ai在j属于(1~m)中,有(ai&aj)|c == c即可 

#include<iostream>
using namespace std;
int a[400],b[499];
int main()
{
	int n,m;
	cin >> n >> m;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	for(int i = 1;i <= m;i++)
	{
		cin >> b[i];
	}
//	int ans = 0;
	for(int i = 0;i <= (1<<9);i++)
	{
		int cnt = 0;
		for(int j = 1;j <= n;j++)
		{
			int f = 0;
			for(int k = 1;k <= m;k++)
			{
				if(((a[j]&b[k])|i) == i)
				{
					f = 1;
					break;
				}
			}
			if(f == 1)
			{
				cnt ++;
			}
			else
			break;
		}
		if(cnt == n)
		{
			cout<<i;
			return 0;
			
		}
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值