阅读题目,有这句话:这些筷子中只有一只筷子是落单的,其余都成双。因此我们由这句话可以受到一些启发。再看题目的内存限制,只有 4MB,所以对空间有了很大的要求。
根据题意,我们需要找到落单的筷子,那么如何进行成双的配对呢?很简单,就是异或。两个相同的数 x^x 的值一定为 $0$。所以我们只需要从 $1$ 至 $n$ 扫一遍,进行异或 ans ^= x。若第 $x$ 个数的长度已经配对,那么这个数将与之前的某个数得到 $0$ 的结果,则最后 ans 的值也就是落单的筷子的长度了。
注意:数据读入对程序效率造成的影响! 因此我们在程序设计时使用快读,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <iostream> #include <cstdio> using namespace std; inline int read(); int main() { int n,x,ans = 0; n = read(); for(register int i = 1;i <= n;++i) x = read(),ans ^= x; printf("%d\n",ans); return 0; } inline int read() { long long s = 0,f = 1; char ch = getchar(); while((ch < '0' || ch > '9') && ch != EOF) { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
|