Codeforces Round #503 (by SIS, Div. 2)-B. Badge

版权声明:本文为博主原创文章,欢迎转载。 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;
}

猜你喜欢

转载自blog.csdn.net/Smiler_/article/details/82107607