1. 程式人生 > 其它 >CF1395C Boboniu and Bit Operations

CF1395C Boboniu and Bit Operations

Boboniu and Bit Operations

題目大意:有兩個非負整數序列\(a_1,a_2...a_n\)\(b_1,b_2...b_m\),對於每個\(i(1\le i\le n)\),你可以選擇一個\(j(1\le j\le m)\),並使得\(c_i=a_i\&b_j\) 求出\(c_1|c_2|...|c_n\)的最小值
\((0\le a_i,b_i\lt 2^9,1\le n,m\le200)\)

思路:首先觀察一下資料範圍\(a_i,b_i\lt 2^9\),或運算之後最終結果肯定也小於512,並且\(1\le n,m\le200\),那我們可以直接暴力列舉\(0\le ans\le 512\)

,那麼在列舉每個\(ans\)的情況下,只要滿足\(a_i\&b_j|ans=ans\),對於每個\(a_i\)都找到一個\(b_j\)符合即可,有一個\(a_i\)不符合就不成立,列舉下一個\(ans\)...直到找到第一個滿足的\(ans\)即為答案

Code:

#include <bits/stdc++.h>
using namespace std;
const int N=250,mod=1e9+7;
typedef long long ll;

int n,m,a[N],b[N];
bool check(int x){
	for(int i=1;i<=n;i++){
		bool flag=true;
		for(int j=1;j<=m;j++){
			if(((a[i]&b[j])|x)==x){
				flag=false;
				break;
			} 
		}
		if(flag) return false;
	}
	return true;
}

int main(){

	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) cin>>b[i];
	for(int i=0;i<=512;i++){
		if(check(i)){
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}