ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1554C. Mikasa 按位枚举求最小值

2021-07-30 20:04:48  阅读:208  来源: 互联网

标签:1554C int 最小值 异或 按位 bigoplus 1101 Mikasa 1010


题意

给正整数 n , m n,m n,m,构造出 0 ⨁ n , 1 ⨁ n . . . . m ⨁ n 0\bigoplus n,1\bigoplus n....m\bigoplus n 0⨁n,1⨁n....m⨁n,求此序列中未出现的最小数字。

解析

出现未出现的最小数字字眼,只要代换进公式即可,假设 k k k是出现过的数字, 设 0 < = x < = m 0<=x<=m 0<=x<=m。

x ⨁ n = k x \bigoplus n =k x⨁n=k
根据交换律
n ⨁ k = x < = m n \bigoplus k =x <=m n⨁k=x<=m
也就是说,如果你出现过,你就会满足这个条件,因此我们加以转换
当 n ⨁ k > = m + 1 , k n \bigoplus k >= m+1,k n⨁k>=m+1,k 的最小值就满足题意。
因此这个问题就转化成
n ⨁ k > = m + 1 = p n \bigoplus k>=m+1=p n⨁k>=m+1=p

已知 n , p n,p n,p求 k k k的最小值
这个问题就实属典中点问题了。

我们画个图来解释,假设 n = 1010 ( 2 ) , p = 1101 ( 2 ) n=1010(2),p=1101(2) n=1010(2),p=1101(2)
w
由于 n ⨁ k > = p n \bigoplus k>=p n⨁k>=p,因此第一位的n异或k我们必须为1

在这里插入图片描述

所以我们此时的k必须为0
在这里插入图片描述

同理,第二位的n异或k,必须为1,k也必须为1
在这里插入图片描述
第三位的时候,n异或k为1和为0都能满足公式,但是为了让我们的k尽可能小,因此我们选择n异或k为1,k=0,让我们的k尽可能地小。

在这里插入图片描述
第四位的时候也同理
在这里插入图片描述
所以我们就能根据从高位到低位的按位枚举从而求出k的最小值。
很典中典了。

但是当我们处在下面阶段的时候就没必要比较了,因为 n ⨁ k > = p n \bigoplus k>=p n⨁k>=p已经永远成立,因此k的后面的位数所有取0就是最小的。
在这里插入图片描述

代码

#include<bits/stdc++.h>
using  namespace  std;
void solve(){
    int n,m;
    cin>>n>>m;
    int p=m+1,k=0;
    for(int i=30;i>=0;i--){
        int a=(n>>i)&1,b=(p>>i)&1;
        if(a!=b){
            if(b){//
                n|=(1<<i);//把答案存进n里面。
                k|=(1<<i);
            }
        }
        if(n>=p)break;//满足了条件了,我们就没必要再比较了
    }
    cout<<k<<endl;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

标签:1554C,int,最小值,异或,按位,bigoplus,1101,Mikasa,1010
来源: https://blog.csdn.net/TKKDOUZI/article/details/119254804

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有