蓝桥杯2018年第九届真题-小朋友崇拜圈-模拟法

题目: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值