约瑟夫环

108 阅读1分钟

蓝桥

#include <iostream>
using namespace std;
typedef long long ll;
const int N=2e5+10;
ll n,k;
ll a[N],pre[N];
int main() {
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i];//第i个元素可以跳到第i个位置 
	}
	int now=1;
	ll cnt=1;
	while(k--){
		now=a[now];
		//遇到重复位置,进行优化 
		if(pre[now])  k%=cnt-pre[now];//计算出循环的长度cnt-pre[now],对k取模长度,直接跳到循环内的对应位置 
		pre[now]=cnt++;//记录已经去过的地方 
	}
	cout<<now;
    return 0;
}

这段代码是一个模拟约瑟夫环问题的算法,主要思路是使用数组来模拟人们依次出列的过程。

  1. 代码首先定义了一些常量和变量,包括数组大小 N,整数变量 n, k,以及数组 a 和 pre 用于存储元素和记录已经走过的位置。
  2. 用户输入 n 和 k,表示约瑟夫环的总人数和游戏进行的次数。
  3. 然后使用循环读入 n 个整数,表示每个人可以到达的下一个位置。
  4. 初始化当前位置为 1,已经走过的步数为 0。
  5. 通过一个循环,不断按照 a 数组中的指示移动当前位置 now 到下一个位置。
  6. 如果现在的位置之前出现过,即 pre[now]不为 0,则进行优化,节省计算时间。
  7. 最后输出当前位置 now。