位運算 最長子集

2021-10-13 13:27:48 字數 1076 閱讀 3811

【問題描述】有乙個整數序列 a1,a2,…,an. 請找到乙個集合的乙個最長子集s,使得對於∀i,j ∈ s, ai ⊕aj < min(ai,aj) ,其中 ⊕ 表示按位異或運算.

【輸入形式】需要輸入兩行,第一行輸入乙個數 n (1 ≤ n ≤ 105), 表示數列a1,a2,…,an的長度。第二行輸入 n 個整數: a1,a2,…,an (1 ≤ ai ≤ 109).

【輸出形式】輸出集合s的最大長度

【樣例輸入1】

3

1 2 3

【樣例輸出1】 2

【樣例輸入2】

5

1 1 1 1 1

【樣例輸出2】 5

【樣例1說明】1 2 3 中2和3的異或結果等於1,既小於2又小於3

【提示】如果兩個數的異或結果小於這兩個數中的任何數,那麼這兩個數應該滿足什麼條件?從最高位出發。

該題改編自原藍橋杯題目,對於初學者來說據有一定的難度,特別是位運算對於會給初學者帶來一定的不適。

題目本意為輸入數列個數,和數列內容,找到符合條件的子集。

以下是同學寫出的程式

#include

#include

int min (

int a,

int b)

intmain()

}if(j==i)

break;}

printf

("%d"

,max)

;return0;

}

以下是參考**

#include

#include

intmain()

,n,i;

unsigned x;

scanf

("%d"

,&n)

;int max =0;

for(i =

1;i <= n;i++)}

printf

("%d\n"

,max)

;return0;

}

leetcode 子集 dfs,位運算

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 class solution vectorint subsets vector int nums 先上 cl...

利用位運算求子集

紫書第189頁 給你乙個集合,讓你求集合的所有子集 我們都知道長為n的集合子集個數為 2 n 個 包含了空集 一般都是遞迴求子集,沒想到還可以運用位運算求 具體思路就不展開了,總的來說就是每個元素在子集裡都有兩種情況 取或不取 可以用0和1來代表,這就跟位運算的性質所吻合 include defin...

leetcode 78 子集(位運算求子集)

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集 冪集 說明 解集不能包含重複的子集。示例 輸入 nums 1,2,3 輸出 3 1 2 1,2,3 1,3 2,3 1,2 分析 含有n個元素的集合共有 1 一位後與 1的方式判斷最後一位是0還是1,如果是1,就把對應位置的數加入到...