51Nod 1315 合法整數集

2021-08-14 23:22:10 字數 1067 閱讀 9583

這道題 一開始 沒有思路 然後 根據他人啟發 問我什麼要需要刪 什麼不需要刪

什麼不需要刪 根據 或(|)運算性質 如果 兩個數相或 只要任意一位二進位制數字為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為或操作。...