思路一
因为N范围不大,故创建一个数组,哈希。(或者也不用创建数组,直接N(N+1)/2-t, t 为学姐念到的(N-1)个同学的学号,这里注意总和用LL,否则可能会爆)
代码:
#include <iostream>
#include <cstring>
using namespace std;
int N;
int stu;
int main()
{
while(scanf("%d", &N) != EOF)
{
int hashset[N + 1];
memset(hashset, 0, sizeof hashset);
for(int i = 1; i < N; i ++ )
{
scanf("%d", &stu);
hashset[stu] ++;
}
for(int i = 1; i <= N; i ++ )
if(hashset[i] == 0)
stu = i;
printf("%d\n", stu);
}
return 0;
}
思路二
巧妙应用异或运算的性质
假设该迟到同学为c,其他同学异或结果为b,全班同学异或结果为a,则有:c ^ b = a,由异或运算的性质可得:c = a ^ b.
代码
#include <iostream>
using namespace std;
int N;
int stu;
int main()
{
while(scanf("%d", &N) != EOF)
{
int a = 0, b = 0;
for(int i = 1; i <= N; i ++ ) a ^= i;
for(int i = 1; i < N; i ++ )
{
scanf("%d", &stu);
b ^= stu;
}
printf("%d\n", a ^ b);
}
return 0;
}
对比:
可知,运用异或的性质,运行时间和占用空间都更少。