题解 | 谍中谍中谍中谍中谍...

谍中谍中谍中谍中谍...

https://www.nowcoder.com/practice/ee1246384c9b4066b67043ebb37fd9c9

/*我的直观想法是用一个数组freq记录学生被抓取的次数,从1到n的循环每次都初始化freq数组元素为0,然后随着指认链向前为freq数组元素赋值,被指认到一次就使得元素值++,一次指认后检查被指认元素的freq值是否> 1,大于1则打印当前学生编号并停止指认循环*/
#include <stdio.h>
#include <stdlib.h>

int main() {
    //读取数据
    int n;
    scanf("%d\n", &n);
    int *p = (int *)malloc(sizeof(int) * n);
    for(int i = 0; i < n; i++){
        scanf("%d", p + i);
    }
    
    //建立freq数组
    int *freq = (int *)malloc(sizeof(int) * n);

    //对每一个学生开始进行计算
    for(int a = 0; a < n; a++){
        //初始化freq数组
        for(int j = 0; j < n; j++){
            freq[j] = 0;
        }
        int cur = a;//当前被指认者,初始化为a
        while(1){
            freq[cur]++;//被指认者freq++
            if(freq[cur] > 1){//freq值大于1即为劝退者,打印结果,结束循环
                printf("%d ",cur + 1);
                break;
            }
            cur = p[cur] - 1;//cur转向下一个被指认者
        }
    }

    //释放空间
    free(p);
    free(freq);
    
    return 0;
}













全部评论

相关推荐

2025-12-15 14:25
云南大学 Java
lei22:入职可能会看学信网,最好别伪装,这个简历找实习肯定是够的,肯定会有收 28 届实习生的公司的,多投就行
点赞 评论 收藏
分享
2025-12-13 20:26
浙江大学 Java
淬月星辉:把浙大的校名加大加粗,把校徽再贴出来,就OK了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务