找 筷 子 找筷子 找筷子
题目链接: l u o g u P 1469 luogu\ P1469 luogu P1469
题目
经过一段时间的紧张筹备,电脑小组的“ R P RP RP 餐厅”终于开业了,这天,经理 L X C LXC LXC 接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题:筷子!
C X CX CX 小朋友找出了餐厅中所有的筷子,但遗憾的是这些筷子长短不一,而我们都知道筷子需要长度一样的才能组成一双,更麻烦的是 C X CX CX 找出来的这些筷子数量为奇数,但是巧合的是,这些筷子中只有一只筷子是落单的,其余都成双,善良的你,可以帮 C X CX CX 找出这只落单的筷子的长度吗?
输入
第一行是一个整数,表示筷子的数量 n n n。
第二行有 n n n 个整数,第 i i i 个整数表示第 i i i 根筷子的长度 a i a_i ai。
输出
输出一行一个整数表示答案。
样例输入
9
2 2 1 3 3 3 2 3 1
样例输出
2
数据范围
对于
30
%
30\%
30% 的数据,保证
n
≤
1
0
5
n \leq 10^5
n≤105。
对于
100
%
100\%
100% 的数据,保证
1
≤
n
≤
1
0
7
+
1
1 \leq n \leq 10^7 + 1
1≤n≤107+1,
1
≤
a
i
≤
1
0
9
1 \leq a_i \leq 10^9
1≤ai≤109。
提示
请注意数据读入对程序效率造成的影响。
请注意本题的空间限制为
4
M
b
4\ Mb
4 Mb。
思路
这道题要我们找出多出来的那个筷子的长度,但是题目的空间限制是 4 M b 4\ Mb 4 Mb,那么也就是说,我们不能开 a [ n ] a[n] a[n]那么大的数组。
那怎么办呢?
我们就可以用一个叫做异或的东西来解决。异或就是把两个数在二进制中相同的地方变成
0
0
0,不同的地方变成
1
1
1,其实就是找出两个数的不同之处。
那么也就是说,如果两个数相同,那么它们异或的结果就是
0
0
0。
又因为配对的筷子长度一样,那我们直接把所有筷子的长度异或在一起,就可以得出多出来的那个筷子的长度了。
代码
#include<cstdio>
#define rr register
using namespace std;
int n, ans, x;
int read() {//快读
int re = 0;
char c = getchar();
while (c < '0' || c > '9')
c = getchar();
while (c >= '0' && c <= '9') {
re = re * 10 + c - 48;
c = getchar();
}
return re;
}
int main() {
n = read();//读入
for (rr int i = 1; i <= n; i++) {
x = read();//读入
ans ^= x;//异或
}
printf("%d", ans);//输出
return 0;
}