版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84791544
这道题首先要读懂题。刚开始读的时候不明白or是啥意思,后来历经千辛万苦重要查了很长时间百度才搞明白了or的意思就是‘或’,即位运算符‘|’。
运算规则可以看这里C++位运算符(&、 | 、^)
那么这道题要转换成二进制做了。
分两种情况:一种是不可能去删除的数,一种是可能要删除的数。
1、如果一个数y符合(y|x)>x,则不可能去删除y。即x某一位是0,y集合里面的某个数的那一位是1的时候.
2、根据'|'运算符的特点,当x某一位是1,而y集合里面的数的那一位都是0的时候,没有给x提供1的数,这时候是不可能运算出来x的。
当x某一位是1,y集合里面的一些数的那一位是1的时候,记录1出现的次数,去最小出现次数,去掉它,就没数给x提供那一位的1了,也就符合题意了。
#include <iostream>
#include <algorithm>
using namespace std;
int dk[100],dn[100]={0};
int main()
{
int n,k,x,i,key1=0;
cin>>n>>x;
k=x;
while(k)
{
dk[key1++]=k%2;
k/=2;
}
for(i=0;i<n;i++)
{
int y;
cin>>y;
if((y|x)>x)
continue;
int key2=0;
while(y)
{
dn[key2++]+=y%2;
y/=2;
}
}
int ans=55;
for(i=0;i<key1;i++)
{
if(dk[i]&&!dn[i])
{
ans=0;
break;
}
if(dn[i])
ans=min(ans,dn[i]);
}
cout<<ans<<endl;
return 0;
}