1040寻找单身狗

19 篇文章 0 订阅
11 篇文章 0 订阅


1040: 寻找单身狗 [思维]

时间限制: 1 Sec  内存限制: 128 MB

提交: 159  解决: 51  统计

题目描述

杜陵韦固,元和二年旅次宋城遇一老人倚布囊,坐于阶上,向月捡书。固问所寻何书,答曰:“天下之婚牍耳。”又问囊中何物,答曰:“赤绳子耳。以系夫妻之足,及其生,则潜用相系,虽讎敌之家,贵贱悬隔,天涯从宦, 吴楚异乡,此绳一系,终不可逭。”——唐代李复言《续玄怪录·定婚店》。

这个在月下倚布囊、坐于阶上、向月检书的老人,即是后来在民间被奉为婚姻之神的月下老人。只要其用囊中红绳把世间男女之足系在一起,即使经历“仇敌之怨,贵贱悬隔,天涯从宦,吴楚异乡”等折磨,也会化解一切最终成为夫妻。

但月老也有尴尬的时候!

这一日,他照常系红线,却发现这一批年轻人的数量是奇数!

他划分的标准是根据每个人的“X”值,若两个人的“X”值相同,那么月老就会把他们连在一起。不过因为总数是奇数,所以总会有一个人被空出来,我们称之为“单身狗”。

不过好在除了这个“单身狗”,其余所有人都恰好可以组成两两一对。

现在给出所有人的“X”值,请找出“单身狗”的X值。

需要注意的是,也许单身狗也有与其X值相同的人,但是这个人已经有其他人相连了。

输入

第一行是一个整数 n n (  0<n<100000n 0<n<100000且n为奇数 ),代表有 n n个人。

下面一行有 n n个以一个空格分开的整数 ai ai (  0<m<109 0<m<109 ),代表每个人的“X”值。

输出

输出单身狗的“X”值。

样例输入

5
2 3 4 2 3

样例输出

4

提示

此题存在基于位运算的时间复杂度 O(n) O(n)、空间复杂度 O(1) O(1)算法。

来源


自己的程序编码

#include<iostream>
#include<map>
using namespace std;
int main()
{
	int n,m;
	map<int,int>mp;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>m;
		mp[m]++;
	}
	map<int,int>::iterator it;
	it=mp.begin();
	while(it!=mp.end())
	{
		if(it->second&1)//判断是否为奇数
		{
		cout<<it->first<<endl;
		break;
	}
		else
		it++;
	}
}


OJ平台要求用异或运算求解

没接触过异或运算在网上查了一下代码如下

#include<iostream>
#include<algorithm>      
#include<cstring>   
#include<cstdio>     
#define N 10000000001    
using namespace std;      
int a[1000000];      
int main()      
{      
    int n,i,ans=0;      
    scanf("%d",&n);      
    for(i=0;i<n;i++)    
    {    
        scanf("%d",&a[i]);     
    }       
    for(i=0;i<n;i++)      
    {   
        ans^=a[i];         
    }      
    printf("%d",ans);    
    return 0;      
}  

异或的意思是 按位比较(二进制),位相同(0,0或1,1)时,结果为0,位不同时(0,1或1,0)结果为1
0异或任何数A 结果还是A
异或还可以用于两个数的交换(不用借助第三个变量)
void swap(int &a,int &b)
{
    a=a^b;
    b=b^a;
    a=a^b;
}
详解:
1
2
3
4
5
a1=a^b
 
b=b^a1=b^a^b=a
//此时a1=a^b  b=a
a=a1^b=a^b^a=b
同一变量与另一变量和其异或值异或等于另一个数,如(a^b)^a=b。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值