1 条题解

  • 0
    @ 2025-8-24 21:16:44

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Igallta
    「この世には愛も知らない人が 沢山いるんですよ」

    搬运于2025-08-24 21:16:43,当前版本为作者最后更新于2024-11-26 14:27:42,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    简要题意

    给你一个 nn 和一个数组 pp,如果 ppiip_{p_i}\not=iii 期望同桌的期望同桌不是 ii,那么此时 ii 就不满意)或者 pi=ip_i=i,那么输出 No。否则输出 Yes

    思路

    首先,我们肯定要输入。

    这个地方因为不关课桌的事,所以可以直接给 nn22。这部分的代码:

    cin>>n;
    n*=2;
    

    然后,我们要输入 pp 数组。在这里我们就可以判断 pip_i 是否的等于 ii 了,如果是直接输出 No 并结束程序的运行。

    这部分的代码:

    for(int i=1;i<=n;i++){
    	cin>>want[i];//这里的 want 就是 p 数组 
    	if(want[i]==i){
    		cout<<"No";
    		return 0;
    	}
    }
    

    为什么不能边输入边判断 ppiip_{p_i}\not=i 呢?因为次数只输入了 ii 个数据,如果 pi>ip_i > i 那么因为 C++ 全局变量的特性,ppip_{p_i} 会等于 00

    所以,接下来我们要到单独用一个循环去判断 ppiip_{p_i}\not=i。还是跟前面一样,只要有就直接输出 No 并结束程序。

    最后,如果前面都没有结束那么最后还要输出 Yes 哦!

    这部分的代码:

    for(int i=1;i<=n;i++){
    	if(want[want[i]]!=i){
    		cout<<"No";
    		return 0;
    	}
    }
    cout<<"Yes";
    
    • 1

    信息

    ID
    10901
    时间
    1000ms
    内存
    512MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者