51nod 1315 合法整數集

2021-09-19 10:56:22 字數 1441 閱讀 8739

乙個整數集合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.

收起

第一行兩個整數n,x,其中n為y集合元素個數,x如題所述,且1<=n<=50,1<=x<=1,000,000,000.

之後n行,每行乙個整數yi,即集合y中的第i個元素,且1<=yi<=1,000,000,000.

乙個整數,表示最少刪除多少個元素。
5 712

478

分析:

因為要求乙個集合,滿足任何子集滿足異或和!=x,我們需要找乙個最小的集合,

4 7舉例

0 0 1

0 1 0

1 0 0

1 1 1

num: 2 2 2

因為我們知道某乙個a[i]的二進位制的j位為1,則這個a[1~n]所有的數在j為或和為1,,所以我們只要確保一位與x的對應那一位不同即可,所以,我們只要刪除min(num[1~i]),保證剩下的集合最大即可.

但上述思想,有乙個漏洞,因為例子為7:111,全1,但可能會出現x對應二進位制為為0的情況,我們想一下什麼時候才可能或和0,a[1~n]的對應二進位制位必須一路全為0,即有乙個a[i]的該二進位制為為1,則這個集合或和!=x,但不能保證子集沒有,所以去掉a[i],繼續判斷子集合.

所以第一步就刪除a[i] 的二進位制為1,但x的二進位制為0的數,然後求出剩下可能或和==x的數,去掉最小的num[i]即可

#includeusing namespace std;

const int mod=1e9+7;

const int n=100;

typedef long long ll;

ll a[n];

int num[n];

int judge(ll n,ll x)

return 0;

}void f(ll n)

}int main()

int ans=1e9;

int flag=0;

for(int i=1;i<=35;i++)

x/=2; }

printf("%d\n",ans);

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