第九届蓝桥杯省赛JAVA语言 C组题解_题9 小朋友崇拜圈)

JAVA语言 C组题解_题9 小朋友崇拜圈

题目

班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。
在一个游戏中,需要小朋友坐一个圈,
每个小朋友都有自己最崇拜的小朋友在他的右手边。
求满足条件的圈最大多少人?

小朋友编号为1,2,3,…N
输入第一行,一个整数N(3<N<100000)
接下来一行N个整数,由空格分开。

要求输出一个整数,表示满足条件的最大圈的人数。

例如:
输入:
9
3 4 2 5 3 8 4 6 9

则程序应该输出:
4

解释:
如图p1.png所示,崇拜关系用箭头表示,红色表示不在圈中。
显然,最大圈是[2 4 5 3] 构成的圈
在这里插入图片描述

再例如:
输入:
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

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

解题思路

1、找规律理解崇拜关系,将一行整数存入数组nums,则崇拜关系可表示为:x崇拜nums[x-1];
2、定义变量max保存最长崇拜圈。
3、遍历数组进行寻找,找到崇拜的人存入集合中且集合内未有重复元素则计数器加1
4、每次遍历后比较计数器con和max,将最大的数保存为max。
5、输出max。

//java代码
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();//接收用户输入的第一个数
		int[] nums = new int[n];
		//接收用户输入的一行整数并存入数组
		for (int i = 0; i < n; i++) {
			nums[i] = sc.nextInt();
		}
		// 崇拜规则: x崇拜nums[x-1];
		int max = 0;//保存最长崇拜圈
		for (int i : nums) {
			List<Integer> list = new ArrayList<>();
			int con = 0;
			int x = i;
			while (!list.contains(x)) {//判断x是否存在于集合里,不存在则进入循环
				list.add(x);//将x存入集合中
				x = nums[x - 1];// 将寻找下一个崇拜的人
				con++;//计数器加一
				
				if (con > max) {
					max = con;//如果计数器大于max则将计数器的值赋予max
				}
			}
		}
		//输出max
		System.out.println(max);
	}

猜你喜欢

转载自blog.csdn.net/NanyouqiaoMu_/article/details/84315419