标题:小朋友崇拜圈
班里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;
}