O(n-1)时间复杂度,无需数组或链表,太酷啦!!!

凌艺樽  •  5个月前


#include <iostream>
using namespace std;
int Choose_king(int n,int m)
{
	int k=0;
	for(int i=2;i<=n;i++)
	{
		k=(k+m)%i;//将胜利者的位置向前移m位,%i
	}
	return k+1;
}
int main()
{
	int n,m;
	//f(N,M)=(f(N-1,M)+M)%N
	cin>>n>>m;
	cout<<Choose_king(n,m);
	return 0;
}

帅爆了,解释可以看这里:https://blog.csdn.net/u011500062/article/details/72855826

或者(精筛):

理解这个递推式的核心在于关注胜利者的下标位置是怎么变的。每杀掉一个人,其实就是把这个数组向前移动了M位。然后逆过来,就可以得到这个递推式:

f(N,M)=(f(N-1,M)+M)%N;

因为求出的结果是数组中的下标,最终的编号还要加1


评论: