实验任务
有奇数个人围成一个圈,每个人只知道自己前前处的人。有些人会问你他的
前面是谁。(人的编号从 1 起)
数据输入
第一行 N,代表有几个人。(N <= 30000)
接下来 N 行,每行为 a,b,表示 a 的前前方的人为。
接下来一行为 M,表示 M 次询问。(M <= 30000)
接下来 M 行,每行为 a,表示询问 a 的前方的人。
数据输出
每次询问输出一行。
输入示例
5
1 3
2 4
3 5
4 1
5 2
5
1
2
3
4
5
输出示例
2
3
4
5
1
解题思路
用数组模拟循环队列。
对于一个人,可以通过暴力循环(n+1)/2次知道他前方的人,但是对于题中的数据规模显然会超时。
因此,可以先循环一遍求出整个队列。
参考代码
#include <stdio.h>
#include <string.h>
const int maxn = 30010;
int que[maxn],temp[maxn],ans[maxn];
int main()
{
int n,i,j,a,b,m,t;
while (~scanf("%d",&n)){
for (i = 0;i < n;i++){
scanf("%d %d",&a,&b);
que[a] = b; //a的前前方为b
}
t = 1;
for (i = 1;i <= n;i++){ //temp存循环队列
temp[(2*i-2+n)%n+1] = t;
t = que[t];
}
for (i = 1;i <= n;i++)
ans[temp[i]] = ((i==n)?temp[1]:temp[i+1]);
scanf("%d",&m);
for (i = 0;i < m;i++){
scanf("%d",&t);
printf("%d\n",ans[t]);
}
}
return 0;
}