NYOJ528 找球号(三)(set,位运算)

73 阅读1分钟

题目:

找球号(三)

时间限制: 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
          

代码1(位运算):

异或:二进制位相同为0,不同为1
1^1=0,1^0=1,so 1^2^1=1^1^2=0^2=2\

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    int n,m;
    while(~scanf("%d",&n))
    {
        int ans=0;
        while(n--)
        {
            scanf("%d",&m);
            ans=ans^m;
        }
        printf("%d\n",ans);
    }
    return 0;
}    
//0异或y偶数次的话还是0,异或y奇数次的话是y,所以可以利用这个性质    

\

代码2(set):

关于set--->点这里

#include<stdio.h>
#include<set>
using namespace std;
set<int>a;
int main()
{
    int i,n,m;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
           scanf("%d",&m);
           //如果有成对的就删除 ,没有就插入,最后剩的那一个一定是不成对的那一个
           if(a.find(m)==a.end())
           {
              a.insert(m);
           }
           else
           a.erase(m);
        }
        printf("%d\n",*a.begin());   //返回剩下的那一个数(加*是因为begin()返回的是地址)
        a.clear();
    }
    return 0;
}

 

ps:有时候位运算能巧妙的起很大的作用
\