51Nod 1315 合法整數集

2022-04-27 10:57:15 字數 894 閱讀 1845

1315 合法整數集

例如: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 712

478

output示例

2
解釋:

一開始沒看懂,寫暴搜來著,後來寫殘了,看了一下討論區,發現是找對或運算貢獻值最小的那個數。

詳細解釋就是,首先可以淘汰掉陣列中比x更大的那些值。

然後對比x小的那些數計算對或運算的貢獻值,可以發現,如果x中的某一位為0,而陣列中的數字的對應位是1的話,肯定不能異或出x,所有這種情況也可以不考慮;

最後統計對異或值貢獻最小得值即可。

#include

using

namespace

std;

#define ll long long

#define maxn 100

ll bit[maxn];

ll maxindex=1;

void run(ll x)

}int main()

}ll w=m;

ll l=1;

ll mindel=0x3f3f3f3f;

while(w)

cout

<}

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為或操作。...