noj 1018 选太子 (约瑟夫问题变种)

Problem B

选太子(select the prince)

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

 

某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。

输入:

 

输入两个正整数m n

Input two positive integer.

输出:

 

输出太子的编号
Output the number.

输入样例:

 


 

3 2

输出样例:

 


 

1

来源:

 

 

#include <iostream>
#include <string.h>
using namespace std;

int main(int argc, char const *argv[])
{
	
	int m,n;
	cin>>m>>n;
	int vis[m*2];	//标记数组
	//初始化为0
	memset(vis,0,sizeof(vis));

	int cnt_n = 0, cnt_2m = 0, i = 0;
	int flag = 1;
	while(cnt_2m < m*2 - 1)
	{
		if(cnt_n == n-1 && vis[i] == 0)
		{
			vis[i] = 1;
			cnt_n = 0;
			cnt_2m ++;

			if(cnt_2m == m)  //人数还剩一半,反转
			{
				flag = -1;
			}
		}
		else
		{
			if(vis[i] == 0)	cnt_n ++;
		}
		
		i = (i + flag + m*2) % (m*2);		
	}


	for (int i = 0; i < 2*m; ++i)
	{
		if(vis[i] == 0)
		{
			cout<< i + 1 <<endl;
			
		}
	}

	return 0;
}

 

上一篇:【数据结构--noj】k阶斐波那契数列


下一篇:noj 1574求第k小数