51Nod1315 合法整数集(位运算)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/84791544