信息传递(NOIP2015提高组Day1T2)

本文介绍了一种信息传递游戏的算法解决方法。游戏中n个玩家通过特定规则传递生日信息直至某人得知自己的生日则游戏结束。文章提供了输入输出格式及样例,并采用深度优先搜索策略确定游戏最多能进行的轮数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目描述】
有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值