2 条题解
-
0
#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
本题有好几种解法。
- (一)使用dfs判断是否能抵达终点。
- (二)定义一个标记数组判断是否重复访问同一个位置,一边跳跃一边判断,如果出现重复,输出“NO”,没有重复,输出“YES”。
- (三)预处理判断哪些地方会进入死循环,提前打上标记,如果访问到了这些点就直接输出“NO”。
这些解法都并不难,想学dfs可以看这道题洛谷P1002
但本题题解给出的思路是这样的:
首先,这是一个排列,数组中出现的所有数字都不会重复 所以,每个点的上一个点是固定的,这意味着要想走到终点只有一条已经确定的跳跃路线,而且跳跃的次数必然小于n次,陷入死路的路线次数肯定大约n次。 最终,我们可以用一个for循环边跳跃边判断当前点是否是终点,是则输出“YES”并直接结束程序,否则继续循环。当跳跃次数到达n时,结束循环,输出“NO”
答案如下
- 1
信息
- ID
- 174
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 92
- 已通过
- 25
- 上传者