蓝桥杯 小朋友崇拜圈 C语言


标题:小朋友崇拜圈

班里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


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

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

如果仔细看就不难,如果真想做这道题,自己在纸上画出来,自己找规律
这个相当于是一个 数组指针链表,
下面是代码,如果不懂就自己调试调试,因为代码较少,没有写函数

挨个遍历,会有重复,如果想不重复,自己加个数组判断
我还要去刷题,就不思考了哈  拜

#include<stdio.h>
#include<string.h>

int main()
{
	int a[100100];
	int b[100010];
	int n = 9,i,j,k,max = 0;
	
	scanf("%d",&n);//输入 
	for(i = 1; i <= n;i++)
		scanf("%d",&a[i]);
		
	for(i = 1; i <= n; i++)//n: 总共多少个数 
	{
		for(k = i,j = 0; j < n; j++)
		{
			b[j] = a[k];//数组 a 用来存储输入的 n 个数 
			k = b[j];
			if(b[j] == i)
			{
				if(max < (j+1))
				{
					max = j+1;
					break;
				}
				break;
			}
		}
		memset(b,0,sizeof(b));
	}
	printf("%d",max);
	return 0; 
} 

猜你喜欢

转载自blog.csdn.net/weixin_42295018/article/details/88624649