zoukankan      html  css  js  c++  java
  • Java实现第九届蓝桥杯小朋友崇拜圈

    小朋友崇拜圈

    题目描述
    班里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

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
    不要使用package语句。不要使用jdk1.7及以上版本的特性。
    主类的名字必须是:Main,否则按无效代码处理。

    在这里插入图片描述

    package 蓝桥杯;
    
    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    public class 小朋友崇拜圈 {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] num = new int[n+1];
    		for (int i = 1; i <=n; i++) {
    			num[i]=sc.nextInt();
    		}
    		sc.close();
    		//记录当前的下标	 当前圈的大小	最大的圈有多少人
    		int index=1,count=0,	max=-1;;
    		Set<Integer> set=new HashSet<Integer>();
    		boolean[] bool = new boolean[n+1];
    		while(true){
    			//能添加进去,说明里面没有重复的,可以加
    			if(set.add(index)){
    				//当前圈的数量+1
    				count++;
    				//当前人被用过了
    				bool[index]=true;
    				//替换下标
    				index=num[index];
    				continue;
    			}
    			else{
    				//证明找到圈,与最大圈的人数比较
    				max=Math.max(max, count);
    				//上个圈的记录清空
    				count=0;
    				set.clear();
    				//从1开始找没有被访问过的人,用没访问过的人去继续找圈,循环
    				for (int i = 1; i <=n; i++) {
    					if(!bool[i]){
    						index=i;
    						break;
    					}
    					//如果找到最后一个人都被访问过,证明全部被访问过,直接跳出
    					if(i==n){
    						 System.out.println(max);
    						 return;
    					}
    				}
    			}
    			
    		}
    		
    	}
    
    }
    
    
    package Lqb;
    
    public class Text35 {
    	static int N=30;	//N个小朋友
    	static int max=0;
    	static String maxStr="";
    	public static void main(String[] args) {
    		String str="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"; 	//N个小朋友对应崇拜的对象
    		String quang="";		//崇拜圈临时变量
    		String[] arr=str.split(" ");
    		for(int i=0;i<arr.length;i++){
    			quang=i+1+" ";
    			dg(i+1,quang,arr);
    		}
    		System.out.println("最大圈="+max+"  ["+maxStr+"]");
    	}
    	public static void dg(int i,String quang,String[] arr){
    		if(quang.split(" ")[0].equalsIgnoreCase(arr[i-1])){	//找到圈
    			//System.out.println("找到圈= "+quang);
    			if(quang.split(" ").length>max){
    				 max=quang.split(" ").length;
    				 maxStr=quang;
    			}
    			return;
    		}
    		quang+=arr[i-1]+" ";
    		//System.out.println(quang);
    		if(!quang.split(" ")[0].equalsIgnoreCase(arr[i-1])&&quang.split(" ").length>N){	//死循环圈
    			return;
    		}
    		dg(Integer.parseInt(arr[i-1]),quang,arr);
    	}
    }
    
    
  • 相关阅读:
    HDOJ 4747 Mex
    HDU 1203 I NEED A OFFER!
    HDU 2616 Kill the monster
    HDU 3496 Watch The Movie
    Codeforces 347A A. Difference Row
    Codeforces 347B B. Fixed Points
    Codeforces 372B B. Hungry Sequence
    HDU 1476 Sudoku Killer
    HDU 1987 How many ways
    HDU 2564 词组缩写
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12947769.html
Copyright © 2011-2022 走看看