牛客練習賽23 C 托公尺的位運算(模擬)

2021-08-21 20:26:24 字數 969 閱讀 5968

托公尺完成了1317的上乙個任務,十分高興,可是考驗還沒有結束

說話間1317給了托公尺 n 個自然數 a1... an, 托公尺可以選出一些帶回家,但是他選出的數需要滿足一些條件

設托公尺選出來了k 個數 b1,b2... bk, 設這個數列 b 的給值為 b 中所有數按位與的結果,如果你能找到乙個整除 b 的最大的 2v,(v≥ 0), 則設定 v 為這個數列的給價,如果不存在這樣的 v,則給價值為 -1, 1317 希望托公尺在最大化給價的情況下,最大化 k

第一行輸入乙個整數 n, 第二行輸入 a1...an
第一行輸出最大的整數 k, 第二行輸出 k 個整數 b1... bk, 按原數列的相對順序輸出 (如果行末有額外空格可能會格式錯誤)
示例1

複製

5

1 2 3 4 5

複製

2

4 5

n≤ 10^5, a1... an < 2^31
題解:與的特點是某位為0,則只要添上這個數,最後相與的結果這一位一定是0,因此我們暴力數列的給價

從31到0,每次只有陣列中該位為1才可能對答案有貢獻,並且其他位一定不影響(如果最後答案成立的話)。

#include#include#includeusing namespace std;

#define ll long long

ll n,a[100005],b[100005];

int main(void)

if((ans&-ans)==(1

} printf("%d\n",k);

for(int i=1;iprintf("%lld ",b[i]);

printf("%lld\n",b[k]);

return 0;

}

牛客練習賽23 C 托公尺的位運算

point 首先明確,題目是讓我們從n個數中挑出k個數,他們 上之後的lowbit最大。在lowbit最大的前提下,k最大。遍歷答案v,即lowbit 2 v。for迴圈遍歷陣列,若在第v位存在1 二進位制 我們則肯定取這個數。因為最後k個數一起 後,如果存在答案,肯定是 xx100000這樣的形式...

牛客練習賽23 C 托公尺的位運算

托公尺完成了1317的上乙個任務,十分高興,可是考驗還沒有結束 說話間1317給了托公尺 n 個自然數 a1.an,托公尺可以選出一些帶回家,但是他選出的數需要滿足一些條件 設托公尺選出來了k 個數 b1,b2.bk,設這個數列 b 的給值為 b 中所有數按位與的結果,如果你能找到乙個整除 b 的最...

牛客練習賽23 托公尺的遊戲 概率,期望

題目背景編不下去了 托公尺有一棵有根樹 t,樹根為1,每輪他會在剩下的子樹中等概率乙個點 u,砍掉 u 的子樹 包含 u 如果樹上的點都被砍光了,遊戲結束。求出這個遊戲進行的期望輪數,可以證明這個數一定是有理數,設他為 第一行輸入乙個數 n,表示 t 的點數,下面 n 1 行給出了 t 的每條邊一行...