题目:https://www.dotcpp.com/oj/problem2283.html
思路:
核心思路在于模拟出了“找朋友”的过程,从而解出了答案,步骤如下:
1 将数据存入num数组中,数组编号代表小朋友编号,其对应存放值为崇拜对象编号;初始化一个flag数组,里面存放着访问信息,用于记录一批次中加入的小朋友次序。
2 遍历num数组数组的元素作为第一个加入圈的小朋友。在每次遍历时,先将flag数组初始化(全部置为0),然后首先将遍历到的第一个元素在flag数组里标记好,接着不断加入数组值对应下标的元素并在flag数组里标记好,一直到当前加入元素的崇拜对象已经在flag数组里被标记过,此时就可以记录加入的人数信息,具体逻辑如代码所示。
注:
1 flag存储的是加入队伍的顺序信息,如第三个加入的小朋友,它的数组下标是5的话,对应的flag[5] = 3。
2 倒数第五行:people = people - flag[num[j]] + 1;,之所以这么设计是因为题目中说明的是崇拜对象只能在右手边,所以需要考虑到圈子截断的情况,减去一些人。
#include<iostream>
#include<algorithm>
# include <stdio.h>
# include <string.h>
using namespace std;
int main()
{
int N;
cin>>N;
//flag数组用于记录访问信息
int flag[N+1];
//根据输入信息初始化数组
int num[N+1],i=0,number;
num[i++] = N;
while(cin>>number){
num[i++] = number;
}
int loca = 1;
int max=0,people=0;
for(i=1 ; i<=N ; i++){//从第一个元素起开始遍历
//初始化两个参数
memset(flag,0,sizeof(flag));
people=0;
loca=1;
flag[i] = loca;
loca = loca+1;
people++;
int j=i;
while(flag[num[j]] == 0){
j = num[j];
flag[j] = loca;
loca = loca+1;
people++;
}
people = people - flag[num[j]] + 1;
max = max>people?max:people;
}
cout<<max;
}