这道题的题面是幌子,其实稍稍验证一下就好了:(我在考场上竟将题面当作故事来读)
在样例 1 中, 1 xor 2 xor 5 = 6 ,而在样例 2 中, 9 xor 18 xor 36 xor 25 xor 9 xor 32 = 15 。所以,我们很容易的得到,答案就是所有数的异或和。(不信的话自己举例子)
所以,我们得到了代码:
// luogu-judger-enable-o2 #include <bits/stdc++.h> #define maxn 1000010 #define ri register int using namespace std; inline int read() { int r=0, f=1; char c=getchar(); while((c<'0'||c>'9')&&c!='-') c=getchar(); if(c=='-') f=-1, c=getchar(); while(c<='9'&&c>='0') r=r*10+c-'0', c=getchar(); return r*f; } int n, a[maxn]; long long ans; int main() { n=read(); a[1]=read(); ans=a[1]; for(ri i=2; i<=n; i++) { a[i]=read(); ans^=a[i]; } printf("%d", ans); return 0; }
或者,我们还可以简易的证明一下:
由于在这道题中,可加, 也可异或, 但是, 异或会减, 而加会加, 这道题又要取最小值, 所以, 全部取异或当然会使得答案最小。又因为异或是有交换律的,所以顺序无关紧要。这样,我们也可以推出上面的那个结论。
但是我可能讲得没有官方题解那么详细,所以大家看完我的题解可以再去官方发布的题解那里看一看,也许会有更多收获 。