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;
}