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

博客讲述了Boboniu喜欢的位操作游戏,玩家需要对两个序列的非负整数进行位与操作,然后求解所有结果的最小按位或。文章讨论了错误的解题思路以及最终的解决方案,即通过暴力枚举找到使得按位或结果最小的位与组合。
摘要由CSDN通过智能技术生成

Problem - C - Codeforces

翻译:

Boboniu喜欢位操作。他想和你玩个游戏。

Boboniu给你两个序列的非负整数𝑎1𝑎2,…,𝑎𝑛𝑏1,𝑏2,…,𝑏𝑚。

为每个𝑖(1≤𝑖≤𝑛),要求你选择一个𝑗(1≤𝑗≤𝑚),让𝑐𝑖=𝑎𝑖&𝑏𝑗,&表示位和操作。注意,您可以为不同的𝑖选择相同的𝑗。

找到最小值𝑐1|𝑐2|…|𝑐𝑛,其中|表示按位或操作。

输入
第一行包含两个整数𝑛和𝑚(1≤𝑛,𝑚≤200)。

下一行包含𝑛整数𝑎1𝑎2,…,𝑎𝑛(0≤𝑎𝑖< 29)。

下一行包含𝑚整数𝑏1𝑏2,…,𝑏𝑚(0≤𝑏𝑖< 29)。

输出
打印一个整数:最小值𝑐1|𝑐2|…|𝑐𝑛。

例子
inputCopy
4个2
2 6 4 0
2 4
outputCopy
2
inputCopy
7日6
1 9 1 9 8 10
1 1 4 5 1 4
outputCopy
0
inputCopy
8 5
179 261 432 162 82 43 10 38
379 357 202 184 197
outputCopy
147
请注意
在第一个示例中,我们已经𝑐1 =𝑎1&𝑏2 = 0,𝑐2 =𝑎2&𝑏1 = 2,𝑐3 =𝑎3&𝑏1 = 0,𝑐4 =𝑎4&𝑏1 = 0。因此𝑐1|𝑐2|𝑐3|𝑐4=2,这是我们可以得到的最小答案。

思路:

因为每次或的是c𝑖=𝑎𝑖&𝑏𝑗,所以刚开始想的是,第一个直接取最小的,然后之后每次取的是或运算可以增加最小的值,因为数据范围购小,所以可以随便暴力,每次都把与运算的值跑一遍,加上可以或运算增加最小的。感觉很对但是wa了,后来又感觉可能不能固定起点,所以又加了层for,起点每次都跑一遍,答案取最小值,但是只是多过了几个样例。。。。。说实话没有想到哪里错了。

之后又发现2^9也才512,所以我们直接对答案进行暴力,如果与运算 之后与答案或运算不增加,那么就是包含在内,从小到大遍历,那么第一个全部可以符合的就是最小的答案。

代码:

/*Looking! The blitz loop this planet to search way
 
 Only my RAILGUN can shoot it 今すぐ
 
 身体中を  光の速さで
 
 駆け巡った確かな予感
 
 掴め! 望むものなら残さず
 
 輝ける自分らしさで
 
 信じてるよ  あの日の誓いを
 
 この瞳に光る涙それさえも  強さになるから
 
 */
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stdio.h>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<tuple>
#include<numeric>
#include<stack>
using namespace::std;
typedef long long  ll;
int n,t;
inline __int128 read(){
    __int128 x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9'){
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(__int128 x){
    if(x < 0){
        putchar('-');
        x = -x;
    }
    if(x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}
int a[205];
int b[205];
int m;
void wanyurukong(){
    cin>>n>>m;
    for (int i =1; i<=n; i++) {
        cin>>a[i];
    }
    for (int i =1; i<=m; i++) {
        cin>>b[i];
    }
    ll an=0;
    while (1) {
        int fla=0;
        for (int i =1; i<=n; i++) {
            int bj1=1;
            for (int j =1; j<=m; j++) {
                if (((a[i]&b[j])|an) == an) {
                    bj1=0;
                    break;
                }
            }
            if (bj1) {
                fla=1;
                break;
            }
        }
        if (!fla) {
            printf("%lld\n",an);break;
        }
        else{
            an++;
        }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(); cout.tie();
    t=1;
    while (t--) {
        wanyurukong();
    }
    //wanyurukong
    return 0;
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值