cf-CGR-21A orZ
cf-CGR-21A orZ
给定一个由 n 个整数、a 和一个整数 z 组成的 1 索引数组。 您可以任意次数(可能为零)执行以下操作:
选择一个正整数 i,使得 1≤i≤n。 然后,同时将 \(a_i\) 设置为 (\(a_i\ or\ z\)) 并将 z 设置为 (\(a_i\ and\ z\))。 换句话说,设 \(x\) 和 \(y\) 分别是 \(a_i\) 和 \(z\) 的当前值。 然后将 \(a_i\) 设置为 (\(x\ or\ y\)) 并将 z 设置为 (\(x\ and\ y\))。
这里 \(or\) 和 \(and\) 分别表示按位运算 OR 和 AND。
在任意次数(可能为零)的操作之后找到最大值的最大可能值。
输入
第一行为样例数。
每组样例包含一个\(n\)和\(z\),\((1≤n≤2000, 0≤z<2^{30})\)
输入\(a_1……a_n,(0≤a_i<2^{30}).\)
题目解析
答案是 S=max(ai or z),操作不能转移\(z\)的值,只能与\(a_i\)做交换
#include<bits/stdc++.h>
using namespace std;
int main() {
int tc;
cin >> tc;
while(tc--) {
int n,z;
cin >> n >> z;
vector<int>a(n);
int ans = 0;
for(auto &i:a) {
scanf("%d",&i);
ans = max({i,i|z,ans});
}
cout << ans << endl ;
}
}

浙公网安备 33010602011771号