1. 程式人生 > >第九屆藍橋杯省賽JAVA語言 C組題解_題9 小朋友崇拜圈)

第九屆藍橋杯省賽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); }