ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-11 17:35:22  阅读:235  来源: 互联网

标签:cnt noj int 太子 ++ 约瑟夫 vis 1018 2m


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;
}

 

标签:cnt,noj,int,太子,++,约瑟夫,vis,1018,2m
来源: https://blog.csdn.net/int1282951082/article/details/100742758

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有