题目:
找球号(三)
时间限制: 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:有时候位运算能巧妙的起很大的作用
\