题意是让我们随便改变b元素的顺序,最后使得Ci=Ai^Bi,且Ci&Ci+1&...&Cn的值最大
通过观察样例能够发现,如果某一位上a的0的个数等于b在这一位上1的个数,那么这一位可能是可取的,由于一个数里可能不止一位满足这个条件,所以根据贪心必须从高位向低位去求,如果ans满足高位条件的同时当前位还满足条件说明这一位是可以加上的,a&ans和~b&ans可以消除a求0,b求1的区别,让a和b求相同的数更加方便,~b与-b-1等价
AC代码:
#include <bits/stdc++.h> using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n; cin >> n; vector<int> a(n), b(n); for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } int ans = 0; for (int i = 29; i >= 0; i--) { ans |= (1 << i); vector<int> x, y; for (int j = 0; j < n; j++) { x.push_back(ans & a[j]); } for (int j = 0; j < n; j++) { y.push_back(ans - (ans & b[j])); } sort(x.begin(), x.end()); sort(y.begin(), y.end()); if (x != y) { ans ^= (1 << i); } } cout << ans << '\n'; } return 0; }
D. Maximum AND(位运算 and 贪心)
最新推荐文章于 2024-09-16 17:46:36 发布