2 条题解

  • 5
    @ 2022-2-11 23:59:13

    本题太难了

    现在是2/12 0:08

    死磕了半天终于……还是没搞懂

    终于我想到了他——位运算

    用one代表只出现一次的数位,two代表出现了两次的数位,three代表出现了三次的数位.

    废话不多,上代码

    #include<bits/stdc++.h>
    using namespace std;
    int aa;
    int main(){
    	int n,one=0,two=0,three=0;
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>aa;
    		two^=(one&aa);
        	one^=aa;
        	three=~(one&two);
        	two&=three;
        	one&=three;
        }
        cout<<one;
    }
    

    小知识,大世界:

    假设如果 A = 60,且 B = 13,现在以二进制格式表示,它们如下所示:

    A = 0011 1100

    B = 0000 1101


    A&B = 0000 1100

    A|B = 0011 1101

    A^B = 0011 0001

    ~A = 1100 0011

    下表显示了C++C++支持的位运算符.假设变量AA的值为60,变量BB的值为13,则:

    & 如果同时存在于两个操作数中,二进制ANDAND运算符复制一位到结果中.(A & B)将得到 12,即为00001100

    | 如果存在于任一操作数中,二进制 OROR 运算符复制一位到结果中.(A | B)将得到61,即为00111101

    ^ 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中.(A ^ B)将得到49,即为00110001

     ~ 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0.(~A )将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式

    <<<< 二进制左移运算符。左操作数的值向左移动右操作数指定的位数.A << 2将得到 240,即为11110000

    >>>> 二进制右移运算符.左操作数的值向右移动右操作数指定的位数.A >> 2将得到15,即为00001111

信息

ID
1224
时间
1000ms
内存
5MiB
难度
7
标签
递交数
328
已通过
75
上传者