如何做网站企划案,旅游网站建设维护,平台推广方案模板,如何查找未备案网站给你两个数组a和b#xff0c;随意安排b的顺序#xff0c;问最后 c [ i ] a [ i ] b [ i ] c[i]a[i]\b[i] c[i]a[i]b[i]所有的c的与值的最大值是多少c的每一位如果想为1#xff0c;那么必须a中这一位1的个数等于b中这一位0的个数#xff0c;或者a中这一位0…给你两个数组a和b随意安排b的顺序问最后 c [ i ] a [ i ] b [ i ] c[i]a[i]\b[i] c[i]a[i]b[i]所有的c的与值的最大值是多少c的每一位如果想为1那么必须a中这一位1的个数等于b中这一位0的个数或者a中这一位0的个数等于b中这一位1的个数这个不难想到但是接下来会发现这样考虑的话对于已经分好的块必须要向下递归处理子块使得其满足同样性质也就是一共31层不好处理这种问题的套路有几个第一是贪心高位比低位更优第二是可选的位一定是满足当前位的同时满足更高的位这样的位置所以我们可以假定某一位答案是1然后我们看更高的位能不能满足如果能够满足就说明这一位可以是1否则不可以根据上面的想法可以把每次的答案与a数组中的每个数做一次与运算要求每个数在b数组经过某种运算之后都能找到否则说明这一位不可选因为是贪心所以一定是最优的。那么b中的运算应该是什么呢因为a中是1b中是0所以对b取个反即可
#include iostream
#include cstdio
#include map
#include cmath
#include vector
#include set
#include algorithm
#include functionalusing namespace std;typedef long long ll;int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin t;while(t--) {int n;cin n;vectorint a(n), b(n);for(int i0;in;i) {cin a[i];}for(int i0;in;i) {cin b[i];}int ans 0;for(int i30;i0;i--) {vectorint va, vb;ans | (1 i);for(int j0;jn;j) {va.push_back(ans a[j]);}for(int j0;jn;j) {vb.push_back(ans ~b[j]);}sort(va.begin(), va.end());sort(vb.begin(), vb.end());if(va ! vb) {ans ^ (1 i);}}cout ans \n;}return 0;
}