NOI 1748:约瑟夫问题

描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
 

输入

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:

0 0
 

输出

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

样例输入

6 2
12 4
8 3
0 0

样例输出

5
1
7

这题原本我想用两个cnt来记录剩余的猴子和猴子报的号数、一个fg[]数组来记录这个号数的猴子是否被淘汰 再加一个i来记录报数猴子的数组下标

感觉下标绕来绕去 晕死了 就想到了直接用vector同态数组来存 但又有一个问题出现了 就是你的猴子的号码无法记住 于是我就一开始直接就是把号码存进去 这样就会好很多 然后在通过动态数组的背景 进行猴子淘汰就很方便了 最后数组只剩一个猴子时 他就是king 泰裤辣!

#include<bits/stdc++.h>
using namespace std;
const int N = 305;
int n, m;
int main() {
	while (1) {
		cin >> n >> m;
		if (n == 0) break;
		vector<int> v;
		for (int i = 1; i <= n; ++i) {
			v.emplace_back(i);
		}
		int fg = 0, i = 0;
		while (1) {
			if (v.size() == 1) break;
			i++;
			if (i == m) {
				i = 0;
				//cout << *(v.begin() + fg) << endl;
				v.erase(v.begin() + fg);
				fg--;
			}
			fg++;
			if (fg >= v.size()) fg = 0;
		}
		cout << v.front() << endl;
	}
	

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值