信息传递(NOIP2015提高组Day1T2)

mac2022-06-30  24

【题目描述】 有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。 游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。请问该游戏一共可以进行几轮? 【输入格式】 第1行包含1个正整数n表示n个人。 第2行包含n个用空格隔开的正整数T1,T2,……,Tn其中第i个整数Ti示编号为i的同学的信息传递对象是编号为Ti的同学,Ti≤n且Ti≠i 数据保证游戏一定会结束。 【输出格式】 1 个整数表示游戏一共可以进行多少轮 【样例输入】 5 2 4 2 3 1 【样例输出】 3 【数据范围】 n≤200000 【分析】 暴力深搜即可。

uses math; var a,f:array[0..200001]of longint; i,n,ans,t:longint; procedure search(now:longint); begin if f[now]>0 then begin ans:=min(ans,t-f[now]+1);exit; end; if f[now]<>-1 then begin inc(t); f[now]:=t; search(a[now]); end; f[now]:=-1; end; begin readln(n); for i:=1 to n do read(a[i]); fillchar(f,sizeof(f),0); ans:=maxlongint; for i:=1 to n do if f[i]=0 then begin t:=0; search(i); end; write(ans); end.

转载于:https://www.cnblogs.com/JRX2015U43/p/6533490.html

最新回复(0)