找筷子

找筷子

題目鏈接:luogu P1469luogu\ P1469

題目

經過一段時間的緊張籌備,電腦小組的“RPRP 餐廳”終於開業了,這天,經理 LXCLXC 接到了一個定餐大單,可把大家樂壞了!員工們齊心協力按要求準備好了套餐正準備派送時,突然碰到一個棘手的問題:筷子!

CXCX 小朋友找出了餐廳中所有的筷子,但遺憾的是這些筷子長短不一,而我們都知道筷子需要長度一樣的才能組成一雙,更麻煩的是 CXCX 找出來的這些筷子數量爲奇數,但是巧合的是,這些筷子中只有一隻筷子是落單的,其餘都成雙,善良的你,可以幫 CXCX 找出這隻落單的筷子的長度嗎?

輸入

第一行是一個整數,表示筷子的數量 nn

第二行有 nn 個整數,第 ii 個整數表示第 ii 根筷子的長度 aia_i

輸出

輸出一行一個整數表示答案。

樣例輸入

9
2 2 1 3 3 3 2 3 1

樣例輸出

2

數據範圍

對於 30%30\% 的數據,保證 n105n \leq 10^5
對於 100%100\% 的數據,保證 1n107+11 \leq n \leq 10^7 + 11ai1091 \leq a_i \leq 10^9

提示

請注意數據讀入對程序效率造成的影響。
請注意本題的空間限制爲 4 Mb4\ Mb

思路

這道題要我們找出多出來的那個筷子的長度,但是題目的空間限制是4 Mb4\ Mb,那麼也就是說,我們不能開a[n]a[n]那麼大的數組。

那怎麼辦呢?
我們就可以用一個叫做異或的東西來解決。異或就是把兩個數在二進制中相同的地方變成00,不同的地方變成11,其實就是找出兩個數的不同之處。
那麼也就是說,如果兩個數相同,那麼它們異或的結果就是00
又因爲配對的筷子長度一樣,那我們直接把所有筷子的長度異或在一起,就可以得出多出來的那個筷子的長度了。

代碼

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章