Wraith_Fiee的博客

CF1395C Boboniu and Bit Operations

2021-11-13 · 3 min read
位运算 Codeforces

Boboniu and Bit Operations

题目大意:有两个非负整数序列a1,a2...ana_1,a_2...a_nb1,b2...bmb_1,b_2...b_m,对于每个i(1in)i(1\le i\le n),你可以选择一个j(1jm)j(1\le j\le m),并使得ci=ai&bjc_i=a_i\&b_j 求出c1c2...cnc_1|c_2|...|c_n的最小值
(0ai,bi<29,1n,m200)(0\le a_i,b_i\lt 2^9,1\le n,m\le200)

思路:首先观察一下数据范围ai,bi<29a_i,b_i\lt 2^9,或运算之后最终结果肯定也小于512,并且1n,m2001\le n,m\le200,那我们可以直接暴力枚举0ans5120\le ans\le 512,那么在枚举每个ansans的情况下,只要满足ai&bjans=ansa_i\&b_j|ans=ans,对于每个aia_i都找到一个bjb_j符合即可,有一个aia_i不符合就不成立,枚举下一个ansans...直到找到第一个满足的ansans即为答案

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;
}
 
在吹不出褶皱的日子里发光
Powered by Gridea