【51NOD】 1315

  一個整數集合S是合法的,指S的任意子集subS有Fun(SubS)!=X,其中X是一個固定整數,Fun(A)的定義如下:
A爲一個整數集合,設A中有n個元素,分別爲a0,a1,a2,...,an-1,那麼定義:Fun(A)=a0 or a1 or ... or an-1;Fun({}) = 0,即空集的函數值爲0.其中,or爲或操作。
現在給你一個集合Y與整數X的值,問在集合Y至少刪除多少個元素能使集合Y合法?
例如:Y = {1,2,4},X=7;顯然現在的Y不合法,因爲 1 or 2 or 4 = 7,但是刪除掉任何一個元素後Y將合法。所以,答案是1.
Input
  第一行兩個整數N,X,其中N爲Y集合元素個數,X如題所述,且1<=N<=50,1<=X<=1,000,000,000. 
之後N行,每行一個整數yi,即集合Y中的第i個元素,且1<=yi<=1,000,000,000.
Output
  一個整數,表示最少刪除多少個元素。
Sample Input
5 7
1
2
4
7
8
Sample Output
2
AC代碼:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	long long x;
	long long a[55];
	int b[31],c[31],d[31]={0};
	scanf("%d %lld",&n,&x);
	for(int i=0;i<31;i++)
	{
		b[i]=((x&(1<<i))==0?0:1); //求二進制的各位數 
	}
	for(int i=0;i<n;i++)
	{
		scanf("%lld",&a[i]);
		int flag=1;
		for(int j=0;j<31;j++)
		{
			c[j]=((a[i]&(1<<j))==0?0:1);
			if(b[j]==0&&c[j]==1)  //x的二進制某位爲0,其他的數這位爲1的捨去 
			{
				flag=0;
				break;	
			}
				
		}
		if(flag==1)
		{
			for(int i=0;i<31;i++)
				d[i]+=c[i];
		}
	
		
			
	}
	int ans=50;
	for(int i=0;i<31;i++)
	{
		if(b[i]!=0)  //d[i]!=0怎麼不對?  18分/20分。。 
	    	ans=min(d[i],ans);
	}
	printf("%d\n",ans);
		
		
	return 0;
 } 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章