zoukankan      html  css  js  c++  java
  • NYOJ528 找球号(三)位运算

    找球号(三)

    时间限制:2000 ms  |  内存限制:3000 KB
    难度:2
     
    描述

    xiaod现在正在某个球场负责网球的管理工作。为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数。有一天,xiaod发现少了一个球,你能帮他找出丢的那个球的球号吗?

     
    输入
    有多组测试数据。每组数据包括两行。第一行是一个整数N(0<N<1000000),表示现在所剩的球数。随后的一行是N个数,表示所剩的各个球的编号M(0<M<10^9)。
    输出
    对于每组数据,输出弄丢的那个球的球号。
    样例输入
    5
    1 1 3 6 6
    3
    1 2 1
    样例输出
    3
    2

    这个题用位运算就非常简单了,前提是首先熟悉位运算,这里用到一个异或运算,也就是 ^ 这个符号,他的运算规则是:相同为0,不同为1。知道了这个之后,就容易想到相同的两个数异或之后为0,所以下面很关键的一步,也是我想了好久也没想起来的一步,就是把所有的数都异或一遍,那么最后剩下的一定是那个一个的,还有一点需要注意就是任何数和0进行异或运算都还是他本身。下面是代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     int n;
     9     while (~scanf("%d", &n))
    10     {
    11         int ans = 0;//初始化条件
    12         int t;
    13         for (int i = 0; i < n; i++)
    14         {
    15             scanf("%d", &t);
    16             ans ^= t;//异或运算
    17         }
    18         printf("%d
    ", ans);
    19 
    20     }
    21     return 0;
    22 }

    还有一个从网上看的STL的代码如下:

    #include <iostream>
    #include <cstdio>
    #include <set>
    using namespace std;
    
    int main()
    {
        int n;
        while (~scanf("%d", &n))
        {
            set<int> S;
            int t;
            for (int i = 0; i < n; i++)
            {
                scanf("%d", &t);
                if (S.find(t) == S.end())
                    S.insert(t);
                else
                    S.erase(t);
            }
            printf("%d
    ", *S.begin());
        }
        return 0;
    }

    虽然是STL代码时间比较长,但是这也是一种不错的方法,灵活运用STL对ACM是非常有必要的!

  • 相关阅读:
    移植OpenSSH到arm手记
    编译内核模块找不到内核头文件解决办法
    多线程编程
    多线程编程
    MFC中如何清空CListBox
    Windows文件自删除的两种方法
    【转】显示一个打开文件夹的对话框,并得到用户选择的目录:
    【转】UpdateData()函数
    Windows命名规则
    CListControl如何删除所有子项
  • 原文地址:https://www.cnblogs.com/Howe-Young/p/4324594.html
Copyright © 2011-2022 走看看