问题描述

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。在一个游戏中,需要小朋友坐一个圈,每个小朋友都有自己最崇拜的小朋友在他的右手边。求满足条件的圈最大多少人?小朋友编号为1,2,3,…N,输入第一行,一个整数N(3<N<100000),接下来一行N个整数,由空格分开。要求输出一个整数,表示满足条件的最大圈的人数。

示例1输入:

9

3 4 2 5 3 8 4 6 9

则程序应该输出:4

解释:如下图所示,崇拜关系用箭头表示,红色表示不在圈中。显然,最大圈是[2 4 5 3] 构成的圈。

Python|蓝桥杯—小朋友崇拜圈_Python

图 1 小朋友崇拜圈示意图

示例2输入:

30

22 28 16 6 27 21 30 1 29 10 9 14 24 11 7 2 8 5 26 4 12 3 25 18 20 19 23 17 13 15

程序应该输出:16

解决方案

本题最大的难点在于理解题目,按照题目描述,很容易理解成x崇拜的人位于x的右边,也就是这组整数相邻的人构成崇拜关系,然而结合图形和输入的N个整数,发现如果将这些整数看成是一个数组nums,那么构成崇拜关系的规律应该是x崇拜nums[x-1],那么问题也就迎刃而解了。

Python代码:

N=int(input())

nums=list(map(int,input().split(' ')))#将输入的整数存入列表中

max=0#定义最大人数

for i in range(len(nums)):

    lis = []#用列表模仿崇拜圈

    con=0#定义计数器

    x=nums[i]

    while x not in lis :#判断小朋友是否在圈中,若没在则将他加入圈中并进入循环

        lis.append(x)

        x=nums[x-1]#寻找崇拜者

        con+=1#计数器加一

        if con>max:#比较计数器和最大人数,找到最大的圈

            max=con

print(max)

案列验证:

Python|蓝桥杯—小朋友崇拜圈_Python_02

图 2 示例1测试结果

Python|蓝桥杯—小朋友崇拜圈_Python_03

图 3 示例2测试结果

经过测试,发现结果和题目给定结果相同,说明解题正确。

END

实习编辑   |   王文星

责       编   |   饶龙江

 where2go 团队


   

微信号:算法与编程之美          

Python|蓝桥杯—小朋友崇拜圈_Python_04

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!