2 条题解

  • 0
    @ 2025-9-6 13:57:31
    #include<bits/stdc++.h>
    using namespace std;
    //邪修打法喵~
    int main()
    {
    	int n,i,p=0;
    	cin>>n;
    	int a[n];
    	for(i=0;i<n;i++)
    	{
    		cin>>a[i];
    	}
    	i=0;
    	while(a[i]!=n)
    	{
    		i=a[i]-1;
    		p++;
    		if(p>1000)//纯赌能在1000次以内完成(题给的数据量还是小了,才20个),超出即跳出,避免死循环
    			break;
    	}
    	if(p>1000)
    		cout<<"NO";
    	else
    		cout<<"YES";
        return 0;
    
    ```language
    }
    
    • 0
      @ 2025-8-16 19:21:25

      本题有好几种解法。

      • (一)使用dfs判断是否能抵达终点。
      • (二)定义一个标记数组判断是否重复访问同一个位置,一边跳跃一边判断,如果出现重复,输出“NO”,没有重复,输出“YES”。
      • (三)预处理判断哪些地方会进入死循环,提前打上标记,如果访问到了这些点就直接输出“NO”。

      这些解法都并不难,想学dfs可以看这道题洛谷P1002

      但本题题解给出的思路是这样的:

      首先,这是一个排列,数组中出现的所有数字都不会重复 所以,每个点的上一个点是固定的,这意味着要想走到终点只有一条已经确定的跳跃路线,而且跳跃的次数必然小于n次,陷入死路的路线次数肯定大约n次。 最终,我们可以用一个for循环边跳跃边判断当前点是否是终点,是则输出“YES”并直接结束程序,否则继续循环。当跳跃次数到达n时,结束循环,输出“NO”

      答案如下

      • 1

      [2025 新生训练赛 1] 已睡一刻一刻一刻

      信息

      ID
      174
      时间
      1000ms
      内存
      256MiB
      难度
      6
      标签
      递交数
      92
      已通过
      25
      上传者