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