【Codeforces1395C】Boboniu and Bit Operations(贪心、位运算)

题目大意:

数组a长度为n(1n200),数组b长度为m(1m200),构造数组c满足c[i]=a[i]&b[j],求数组c按位或的和的最小值。


设题目的答案为ans

由于数组ab的元素值小于29,所以数组c元素和ans在二进制表示下最多为9位。

我们考虑使ans的第9位(最高位)最小,然后使第8位最小,接着使第7位最小,依次类推。

若要使ans的第pos位为0,则需要使数组c所有元素的第pos位为0,对于c[i],我们枚举j通过c[i]=a[i]&b[j]计算得出,如果存在一个j使得c[i]pos位为0,并且该c[i]在或运算中不会使ans的后pos1位变大,则该c[i]满足条件。若存在一个i,无法得到满足条件的c[i],则第pos位只能为1

循环进行以上步骤,便可得到ans的值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a[200+10],b[200+10];
int main(){
	cin >> n >> m;
	for(ll i=1;i<=n;i++)cin >> a[i];
	for(ll i=1;i<=m;i++)cin >> b[i];
	ll ans=0;
	for(ll pos=8;pos>=0;pos--){
		bool isempty=true;
		for(ll i=1;i<=n;i++){
			bool flag=false;
			for(ll j=1;j<=m;j++){
				if((((a[i]&b[j])>>pos)|(ans>>pos))==(ans>>pos)){
					flag=true;
				}
			}
			if(!flag)isempty=false;
		}
		if(!isempty)ans+=(1<<pos);
	}
	cout << ans;
	return 0;
}
posted @   Alric  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示