在刚看到杭电OJ2095zhed这道水题的时候,嘴角不由得轻蔑上扬,自信满满的敲完了下面的这段代码
#include<stdio.h>
int main()
{
int n;
while(scanf("%d", &n) && n != 0)
{
int a[n], i, j, ans;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for( i = 0; i < n; i++)
{
int count = 0;
for( j = 0; j < n; j++)
{
if(a[j] != a[i])
count++;
}
if(count == n-1 )
ans = i;
}
printf("%d\n", a[ans]);
}
return 0;
}
但是提交之后,结果却是时间超过了限制。相信很多小伙伴也看到了这道题目下面的温馨提示:
use scanf to avoid Time Limit Exceeded
是我的scanf用错了吗,还是我的scanf是假的
答案是解题方法错误,经历过一些水题磨砺过的少年看完这题之后,心中便会立马想到用数组解决这个问题,然后手指在键盘上飞舞一会之后,自信提交,接下来就是傻眼的时刻了,就是没过,惊喜又意外。废话之后,言归正传。
下面贴出AC代码:
#include<stdio.h>
int main()
{
int n;
while(scanf("%d", &n) && n != 0)
{
int a, b;
scanf("%d", &a);
n--;//因为接受了a作为第一个数,所以只需要在接收n-1个
while(n--)
{
scanf("%d", &b);//逐个接收后面的数值
a ^= b;//本题重点 本题重点 本题重点
}
printf("%d\n", a);
}
return 0;
}
相信小萌新看完上面的代码之后还有点懵,别急,知识点少不了
看这个式子: a^a == 0 当两值相等时用^符号运算得到的值就为0
再看这个式子: b^a^b == a 将它分解 首先b^b==0 然后0^a==a
因此只要输入相同值的个数是偶数则异或(^)运算后必然为0
举个栗子:0^n^n^n^…^n (n的个数为奇数)== 0^n^0^0^…^0 == n
以上知识点摘自https://www.2cto.com/kf/201710/689674.html略有改动
希望对大家有所帮助,谢谢浏览。