例如: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.
之後n行,每行乙個整數yi,即集合y中的第i個元素,且1<=yi<=1,000,000,000.
output
乙個整數,表示最少刪除多少個元素。
input示例
5 7
1 2
4 7
8 output示例
2去年的時候沒讀懂題目- -
只要理解位運算 瞬間這個問題就會簡化
我們為了讓這個集合的所有子集合不等於所給的值
所以,我們要去算這個原集合可能會對這個數二進位製所在位的貢獻。
當然 如果乙個數或所給的數大於所給的數的時候,這個數是不需要被刪除的,因為它的二進位制or任何數也不會等於所給數。
因為它有所給數0的位置是1,or操作進行的時候,無法等於所給數。
之後我們計算所有(x|y)<=y 的數 對y所在二進位制的貢獻。
選擇最小的那個。
#include
using
namespace
std;
long
long d[50];
void run(long
long x)
}int main()
long
long l=0,w=m;
long
long minx=1000000000;
// for(int i=0;i<35;i++) cout//cout<}
}
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 合法整數集
乙個整數集合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...