B. Tenzing and Books

 

 https://codeforces.com/problemset/problem/1842/B

题意:

有三摞书,要看书,可以随意选择那一摞看,但是必须按照顺序取书,一开始他的知识ans=0,

每一次看书(书的知识为a),ans = ans |a,他最喜欢的数字为x,看他读数获取的知识是否能达到x;

思路:

|的特点是有1就为1,&的特点是有0则为0,所以说他读取的书的知识二进制情况下不能在x没有1的情况下有1;

现在有一个数字a,如果a & x = a,说明在a(二进制)的零多于或等于x的0,就是说a中的0包含x中的0,在x有0的地方a都有0,a有0的地方x不一定有0。所以在这种情况下满足让他读的条件

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

#define ll long long

const int N = 1e5 + 9;
int z[4][N];

/*
|是有1则1
&是有0则0 
*/   
void slove()
{
	int n, x;
	cin >> n >> x;
	int ans = 0;
	for(int i = 1; i <= 3; i++)
	{
		for(int j = 1; j <= n; j++)
		{
			cin >> z[i][j];
		}
	}
	int bz = 1;
	for(int i = 1; i <= 3; i++)
	{
		bz = 1;
		for(int j = 1; j <= n; j++)
		{
			if(bz == 1)
			{
				if((x & z[i][j]) == z[i][j])//二进制中没有多余的1,相等说明0的位置是一样的 
				{
					ans |= z[i][j];
				}
				else
				{
					bz = 0;
				}
			}
		}
	}
	if(ans != x)
	{
		cout << "NO\n";
	}
	else
	{
		cout << "YES\n";
	}
}
int main()
{
	std::ios::sync_with_stdio(false);
	
	int t = 1;
	cin >> t;
	while(t--)
	{
		slove();
	}
	return 0;
} 

|与&的关系

伊布

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值