前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法

历届真题 小朋友崇拜圈【第九届】【省赛】【C组】——【C++】【C】【Java】【Python】四种语言解法

作者头像
红目香薰
发布2022-11-30 17:13:14
2500
发布2022-11-30 17:13:14
举报
文章被收录于专栏:CSDNToQQCode

整个题目:

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

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

输入格式

  9   3 4 2 5 3 8 4 6 9   则程序应该输出:   4   解释:   如图所示,崇拜关系用箭头表示,红色表示不在圈中。

  显然,最大圈是[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,否则按无效代码处理。


简单分析:

查长度,那么可以认为是dfs搜索,搜完了比每条线的长度就可以了。所以,难度还是可以的。

C++

代码语言:javascript
复制
#include<iostream>
#include<algorithm>
using namespace std;
int vis[100009];
int ans;
int indug[100009];
int vis1[100009];
void dfs(int n,int qi,int l)
{
	if(vis[n]==qi)
	{
		ans=max(ans,l); 
		return;
	}
	vis1[vis[n]]=1;
	dfs(vis[n],qi,l+1);
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>vis[i];
		indug[vis[i]]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(vis1[i]==0&&indug[i]!=0)
		{
			vis1[i]=1;
			dfs(i,i,1);
		}
	}
	cout<<ans;
	return 0;
}

C

代码语言:javascript
复制
#include<stdio.h>
#define MAX 100005
int state[MAX];
int arr[MAX];
int ans;
void dfs(int k,int step){
	if(state[arr[k]]!=0){
		if(step-state[arr[k]]+1>ans)ans=step-state[arr[k]]+1;
		return;
	}
	state[k]=step;
	dfs(arr[k],step+1);
}
int main()
{
	int n;
	scanf("%d",&n);
	int i;
	for(i=1;i<=n;i++)scanf("%d",&arr[i]);
	for(i=1;i<=n;i++)dfs(i,1);
	printf("%d",ans);
	return 0;
}

Java

代码语言:javascript
复制
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		n = nextInt();
		isWorship = new boolean[n+1];
		a = new int[n+1];
		for(int i = 1;i <= n;i++) {
			int x = nextInt();
			isWorship[x] = true;
			a[i] = x;
		}
		for(int i = 1;i <= n;i++) {
			if(isWorship[i]) {
				start = i;
				dfs(i,0);
			}
		}
		System.out.println(max);
	}
	private static void dfs(int x, int s) {
		if(x > n) return;
		if(x == start && s != 0) {
			max = Math.max(s, max);
			return;
		}
		if(!isWorship[x]) {
			return;
		}
		isWorship[x] = false;
		dfs(a[x],s+1);
	}
	static int nextInt() throws IOException {
		st.nextToken();
		return (int) st.nval;
	}
	static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static int start,a[],n,max;
	static boolean[] isWorship;
}

Python

代码语言:javascript
复制
from collections import defaultdict

n=int(input())
l=[0]+list(map(int,input().split()))
vis=defaultdict(int)
ans=0

for i in range(1,n+1):
  if not vis[i]:
    now=l[i]
    k=1
    vis[i]=k
    while not vis[now]:
      k+=1
      vis[now]=k
      now=l[now]
    ans=max(ans,k-vis[now]+1)
print(ans)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简单分析:
  • C++
  • C
  • Java
  • Python
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档