约瑟夫环!
链接:https://ac.nowcoder.com/acm/problem/22227来源:牛客网
题目描述
n个人(0,1,2,3,4…n-1),围成一圈,从编号为k的人开始报数,报数报到m的人出队(报数是1,2,…m这样报的)。下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人就是大王。现在,给定n,k,m,
请你求出大王的编号。
输入描述:
输入一行包含三个整数n,k,m1<=n<=100,1<=k<=n-1,1<=m<=100
输出描述:
输出一个整数
示例1
输入
[复制](javascript:void(0)😉
5 1 2
输出
[复制](javascript:void(0)😉
3
题解:
c++刚刚学到vector;
解这道题就发现了一片新天地!!
上学期做着题的解法应该是用递归做法;
递归需要系统堆栈,所以空间消耗要比非递归代码大很多,而且如果递归深度太大可能系统会hold不住诶!
源代码如下:
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int main(){
int n,k,m;
cin>>n>>k>>m;
vector<int> s;
for(int i=0;i<n;i++)
{
s.push_back(i);
}
int last=k-1;
while(s.size()>1){
int k=(m+last)%s.size();
s.erase(s.begin()+k);
last=k-1;
}
cout<<*(s.begin());
}