题解 | F-orz
思路讲解
-首先我们可以注意到,对 可以进行按位or操作,对 z 则是按位and操作
对进行按位or操作时,其二进制码制中是1的位置or完也是1;而是0的位置,如果z对应的位置是0,那么对应的操作结果是0,如果z对应的位置是1,那么操作完的结果是1,所以总体来说,or操作的结果是会使
增大的。
8 | 4 | 2 | 1 | |
---|---|---|---|---|
8 | 1 | 0 | 0 | 0 |
5 | 0 | 1 | 0 | 1 |
↓ | ↓ | ↓ | ↓ | |
13 | 1 | 1 | 0 | 1 |
(示例:8和5按位or)
and的情况自己想一下也很简单,同理就是减小的
or操作是单增且幂等的,and操作是单减的,把z中不是0的地方给变成0了,那再回去or操作肯定就让
变小了,所以只需要操作一遍然后比较就可以了
代码实现
#include <stdio.h>
int main() {
int n, z;
scanf("%d %d", &n, &z);
int a[n];
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int max = a[0];
for (int i = 1; i < n; i++) {
if (a[i] > max) {
max = a[i];
}
}
for (int i = 0; i < n; i++) {
int a1 = a[i] | z;
int z1 = a[i] & z;
if (a1 > max) {
max = a1;
}
if (z1 > max) {
max = z1;
}
}
printf("%d\n", max);
return 0;
}