1315 合法整數集
topcoder
基準時間限制:1 秒 空間限制:131072 kb 分值: 10
難度:2級演算法題
乙個整數集合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 = ,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.output之後n行,每行乙個整數yi,即集合y中的第i個元素,且1<=yi<=1,000,000,000.
乙個整數,表示最少刪除多少個元素。input示例
5 712478output示例
2
思路:要求任意子集的所有數的 或運算 != x ,那麼考慮或運算的性質就是有1就為1,所以只要考慮如果加進來的數滿足:
①位數 < x 轉化為二進位制的位數
②x轉化為二進位制的相應位是0,加進來的數相應位必須為0
③ x轉化為二進位制的相應位是0,加進來的數相應位或1或0都可以
滿足這幾個條件的數才有可能去掉。其他的數參與運算不可能==x
code:
#include using namespace std;
const int ax = 50+6;
int a[ax];
int base[ax] = ;
int main()
int cnt = 0;
for( int i = 0 ; i < n ; i++ )
if( temp >= tot )
tmp >>= 1;
temp ++ ;
} if( f ) a[cnt++] = c;
} int re[33] = ;
int res = 100;
if( !cnt ) res = 0;
for( int i = 0 ; i < cnt ; i++ )
tt >>= 1;
tmp++;
} } for( int i = 0; i < 33 ; i++ )
cout << res << endl;
return 0 ;
}
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為或操作。...
51nod 1315 合法整數集
先從數字中去掉與x進行或運算結果不為x的數字,因為這樣的數字肯定在x的某些個為0的位置上數值為1,無論如何也是去不掉的。然後計算出x的二進位制位哪些位置為1,然後從剩下那堆數字中計算x為1的位置那些數字在相應位置也為1的數字的個數。比如x二進位制位的第二位為1,就計算出那些數字中有幾個數字第二位為1...
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為或操作。...