版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/Smiler_/article/details/82107607
B. Badge
http://codeforces.com/contest/1020/problem/B
题意:现在有n个淘气的学生,他们的编号从1~n,老师每次询问一个学生就会在哪个学生的徽章上打一个洞,每次询问完一个学还是能后。一个学生就会说另一个学生a是主谋,老师就会去找a谈话。老师第一次找的学生不一定是谁,现在假设一个询问的学生是i(1~n),问你遇到的第一个徽章上已经被打过洞的学生是谁。
思路:n的数据范围很小,我们可以用(n^2)的算法实现,我们每次选择一个起点,不断的找他指出的同学,并且对我们已经便利过的学生标号进行标记,如果在某次被指出的学生已经被标记过之后,那么这个学生的标号就是答案。
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int a[1050];
int vis[1050];
int main()
{
int n;
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
for(int k=1; k<=n; k++)
{
memset(vis,0,sizeof(vis));
vis[k]=1;
int u=k;
while(true)
{
int v=a[u];
if(vis[v])
{
cout<<v<<" ";
break;
}
vis[v]=1;
u=v;
}
}
return 0;
}