码迷,mamicode.com
首页 > 其他好文 > 详细

DLUTOJ1215

时间:2014-10-17 20:29:18      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   sp   数据   div   on   

题目大意是:给出N个正整数,其中至多有一个数只出现一次,其余的数都出现了两次。判断是否有某个数只出现一次,若有输出这个数,否则输出“-1”。 1<=N<=5000000

这道题的正解是用位运算中的异或XOR(^)

位运算有一个重要性质:与顺序无关。

证明:
1^0=1, 0^0=0
1^1=0, 0^1=1
即0,1与0异或不变,与1异或取反,所以与0异或可以忽略。只考虑1。若m个0, n个1逐次取反,考虑把其中任一位置于开头,若开头是0,则结果为0取反n次,若开头是1,则结果为1取反n-1次,两者必然相等。所以异或运算是可任意交换位置,任意加括号的。

至于这道题,若N是偶数,必然没有只出现一次的数,若N是偶数,根据上面的证明,将0与这N个数逐次异或,最后得到的数就是只出现了一次的那个。异或运算不用特别考虑符号位,代码中unsigned型换成int也行。

#include<cstdio>
using namespace std;
int main()
{
    unsigned t;
    scanf("%u",&t);
    while(t--)
    {
        unsigned k=0, n, id;
        scanf("%u",&n);
        if(n%2==0)
        {
            for(int i=0; i<n; i++) scanf("%u",&id);//虽然到这步就可以直接判断但还是要接着读后面的数据
            printf("-1\n");
            continue;
        }
        for(int i=0; i<n; i++)
        {
            scanf("%u",&id);
            k^=id;
        }
        printf("%u\n",k);
    }
    return 0;
}

 

DLUTOJ1215

标签:style   blog   color   io   for   sp   数据   div   on   

原文地址:http://www.cnblogs.com/Patt/p/4031955.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!