codeforces round 664 C

题意:给你两个序列a和b,让你计算一个c序列,c[i]=a[i]&b[j](同一个b中的元素可以被使用多次),让你求c[1] | c[2] | … | c[n]最小的那个值。
思路:暴力枚举c的值(0-2^9)。vis[i][j]表示前i个数能构建出j。刷表刷出所有情况即可。

var readline=require("readline");
var rl=readline.createInterface({
    
    
    input:process.stdin,
    output:process.stdout
});
var arr=[],a,b,n,m;
rl.on('line',function(inp){
    
    
    arr.push(inp);
    var len=arr.length;
    if(len===1){
    
    
        n=parseInt(arr[0].split(' ')[0]);
        m=parseInt(arr[0].split(' ')[1]);
    }else if(len===2){
    
    
        a=arr[1].split(' ');
        for(var i=0;i<n;i++) a[i]=parseInt(a[i]);
    }else if(len===3){
    
    
        b=arr[2].split(' ');
        for(var i=0;i<m;i++) b[i]=parseInt(b[i]);
        var C=Math.pow(2,9),vis=new Array(201);
        for(var i=0;i<201;i++) vis[i]=new Array(C+1).fill(0);
        for(var i=0;i<n;i++){
    
    
            for(var j=0;j<m;j++){
    
    
                var ab=a[i]&b[j];
                for(var k=0;k<C+1;k++){
    
    
                    if(i>0&&vis[i-1][k]) vis[i][k|ab]=1;
                }
                if(i===0) vis[i][ab]=1;
            }
        }
        for(var i=0;i<=C;i++){
    
    
            if(vis[n-1][i]){
    
    
                console.log(i);
                process.exit(0);
            }
        }
    }
});

猜你喜欢

转载自blog.csdn.net/weixin_43916777/article/details/108010987