题目链接: Boboniu and Bit Operations
大致题意:
给定两个数组a和b, 要求对于每一个a[i], 找到一个b[j], 使得c[i]=a[i]&b[j], 其中b[j]可以重复被选择.
要求: 使得c[1] | c[2] | … | c[n]最小.
解题思路:
两个数进行&操作, 不会大于较大的那个数.
我们可以推知: 结果一定在[0, 29]的范围内, 所以我们只需要从小到大枚举结果, 然后看是否能为每一个a[i]找到不影响结果的b[j]即可.
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2E2 + 10;
int a[N], b[N], c[N];
int main()
{
int n, m; cin >> n >> m;
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for (int i = 1; i <= m; ++i) scanf("%d", &b[i]);
for (int k = 0; k <= (1 << 9); ++k) { //从小到大枚举每一个k的情况
for (int i = 1; i <= n; ++i) {
bool flag = 0;
for (int j = 1; j <= m; ++j) {
if ((a[i] & b[j] | k) == k) { flag = 1; break; }
}
if (!flag) goto here;
}
cout << k << endl; break;
here:;
}
return 0;
}
有的时候, 直接求出答案没那么容易, 不妨进行枚举来尝试每一个可能解是否符合要求