本文主要是介绍NYOJ528 找球号(三)(set,位运算),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:
找球号(三)
时间限制: 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
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);}elsea.erase(m);}printf("%d\n",*a.begin()); //返回剩下的那一个数(加*是因为begin()返回的是地址)a.clear();}return 0;
}
ps:有时候位运算能巧妙的起很大的作用
这篇关于NYOJ528 找球号(三)(set,位运算)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!