這道題 一開始 沒有思路 然後 根據他人啟發 問我什麼要需要刪 什麼不需要刪
什麼不需要刪 根據 或(|)運算性質 如果 兩個數相或 只要任意一位二進位制數字為1
那麼對應結果二進位制位必然 為1 那麼這麼說 我乙個數如果和x相或 是x發生改變了
那麼這個數 必然是不要刪的 是x二進位制數字為0的那一位 經過或運算之後 變成了1
那麼 什麼需要刪呢
把不需要刪的數去除
把所有的剩下的數 列成豎式 後 按位加
就比如說 原題 1 2 4 7 8 去除 8 之後 剩下
1 2 4 7 轉成二進位制
0 0 1
0 1 0
1 0 0
+ 1 1 1
----------------
2 2 2
這個意思是什麼呢 我們要幹什麼 ? 最好構造出來乙個類似不要刪除的數
那麼只要我x二進位制位上有1 且 對應數字不為0 則 要減掉該數字的個數的數字 才能使這數字為0 從而使最終或成的數不為 x
#include
#include
using
namespace
std;
vector
v;int lower[32];
int main()
for(int i=0;iint loc =0;
while(v[i]!=0)
}int ans=0x3f3f3f;
for(int i=0;i<32;i++)
x>>=1;
if(lower[i]!=0) ans = min(ans,lower[i]);
}if(ans!=0x3f3f3f) cout
<< ans << endl;
else
cout
<< 0
<< endl;
}
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為或操作。...