传送门: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 }