C. 猜数字
Time Limit: 10000 ms Memory Limit: 128 MB
Total Submission: 490 Submission Accepted: 68
Total Submission: 490 Submission Accepted: 68
Description
Roll今天去面试,面试官问了这样一个问题,现在有n个数构成的序列,这个序列所有的数字大小都在1~n之间,并且没有重复的,也就是说是1,2,3,..n的一个排列,现在往里面再插入一个1~n之间的数字,在最节省时间和空间的情况下,怎么样把它找出来?这可难倒了Roll,现在他来问问你们,有什么好办法吗?
Input
输入数据包含多组数据,以EOF结束
每组数据为两行,第一行是一个数字N,表示初始序列的长度,第二行有N+1个数字,表示插入数字后的序列
1<=N<=10000000(1e7)
每组数据为两行,第一行是一个数字N,表示初始序列的长度,第二行有N+1个数字,表示插入数字后的序列
1<=N<=10000000(1e7)
Output
对于每组数据,输出一个数字,表示你找到了后来加进去的数字的值。
Sample Input
Original | Transformed |
5 1 2 3 2 4 5 5 4 1 3 2 1 5
5[EOL] 1[SP]2[SP]3[SP]2[SP]4[SP]5[EOL] 5[EOL] 4[SP]1[SP]3[SP]2[SP]1[SP]5[EOL] [EOF]
Sample Output
Original | Transformed |
2 1
2[EOL] 1[EOL] [EOF]
Hint
1、有大量输入输出,使用C++的同学请不要使用cin/cout,可能会导致超时,尽可能的使用scanf/printf
2、注意内存空间限制,某些算法可能会导致超过空间限制(MLE)
2、注意内存空间限制,某些算法可能会导致超过空间限制(MLE)
#include<stdio.h>
int main()
{
int s=2;
while(s--)
{
int a[10000],i,k,j;
scanf("%d",&a[0]);
for(i=1;i<=a[0];i++)
scanf("%d",&a[i]);
for(i=1;i<=a[0]-1;i++)
{
k=i;
for(j=1;j<=a[0];j++)
if(a[k]==a[j]&&k!=j)
{
k=j;
break;
}
if(k==i)
break;
}
printf("%d\n",a[k]);
}
return 0;
}