1. 程式人生 > 實用技巧 >Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

Codeforces Round #664 (Div. 2) C. Boboniu and Bit Operations

傳送門:cf1395C

題意

c[i]=a[i]&b[j],b[j]是b陣列中任意一個,求c[1] | c[2] | ... | c[n]最小值。

題解

經典的二進位制列舉答案,因為a和b的最大值<29,所以最後的結果最大是9個位置全1,不會超過210 ,故只要列舉0到210-1即可。每次答案和a[i]&b[j]的值相與,如果有一個 j 可以使相與後答案不變,那麼當前a[i]可以,如果沒有,那麼當前答案不可以。當所有a[i]都可行,輸出答案,否則繼續列舉。

程式碼

 1 #include<bits/stdc++.h>
 2 using namespace std;
3 4 int a[100100]; 5 int b[100100]; 6 7 int main() 8 { 9 ios::sync_with_stdio(false); 10 cin.tie(0); 11 cout.tie(0); 12 int n,m; 13 cin>>n>>m; 14 for(int i=0;i<n;i++) cin>>a[i]; 15 for(int i=0;i<m;i++) cin>>b[i]; 16 for(int i=0;i<(1<<10
);i++){ 17 int flag1=1; 18 for(int j=0;j<n;j++){ 19 int flag2=0; 20 for(int k=0;k<m;k++){ 21 if((i|(a[j]&b[k]))==i){flag2=1; break;} 22 } 23 if(!flag2) {flag1=0;break;} 24 } 25 if(flag1) {cout<<i<<endl;return
0;} 26 } 27 return 0; 28 }