题目链接:
题目描述:
题目分析:
本题涉及到位运算,从依次使用或运算的特性可知:要想得到目标数字,必须保证选取数字的二进制数中各位数字不能超过目标数字的同位二进制数,如目标数字为2(010),若选取数字为3(011),则末位数中的1将长期存在、不能被抵消。
解题思路:
首先依次判断每排数字是否满足每位二进制数都不超过对应的目标二进制数,由于只需要判断是否有解法,所以可以直接将满足条件的数字与temp2进行叠加或运算,最终只需要判断temp2与目标数字是否相等即可。
s[i][j]&(1<<k)来单纯表示第k位
代码如下:
#include<iostream>
#include<vector>
using namespace std;
void func()//每组数据的解法
{
int n;//n为每排书籍数
long long int fa;//fa为最喜欢的数字
vector<long long int> s[3];//s[i]中储存第i排书架中的难度值
cin>>n>>fa;
long long int temp,temp2=0;
for(int i=0;i<3;i++)//输入书籍难度值
{
for(int j=0;j<n;j++)
{
cin>>temp;
s[i].push_back(temp);
}
}
for(int i=0;i<3;i++)//每本书的难度值的每个二进制位与fa的每个二进制位依次比较
{
for(int j=0;j<n;j++)
{
bool is_aviliable=true;//判断是否有数比fa的二进制数大
//cout<<s[i][j]<<":"<<endl;
for(int k=0;(1<<k)<=s[i][j];k++)
{
//cout<<(s[i][j]&(1<<k))<<" "<<(fa&(1<<k))<<endl;
if((s[i][j]&(1<<k))>(fa&(1<<k)))
{
is_aviliable=false;
break;
}
}
if(is_aviliable)//如果能够满足条件,则直接进行或运算迭代
{
temp2|=s[i][j];
}
else break;//否则跳过本排书籍
}
}
if(temp2!=fa)
{
cout<<"No"<<endl;
}
else cout<<"Yes"<<endl;
}
int main()
{
int n;
cin>>n;
while(n--)
{
func();
}
return 0;
}