约瑟夫问题
时限:100ms 内存限制:10000K 总时限:1000ms
描述: 设有N名同学手拉手围成一圈,自1、2、3、......开始编号,现从1号开始连续数数, 每数到M将此同学从圈中拉走, 求最后被拉走的同学的编号 输入: 两个正整数,分别为N和M。0<N<=100 ;0<M<65535 输出: 一个正整数,为最后被拉走的同学的编号,最后输出回车
输入样例: 100 10
输出样例: 26
思想: 用队列解决本问题容易理解且易实现,将n个数放到队列中,之后以队首从1开始取出放到队列后,直到m取出而不放入队尾。以此循环,最后队列中就剩下1个数,也就是最后剩下的要出队的。
代码:
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
queue<int> Q;
int i,N,M;
while(scanf("%d%d",&N,&M)!=EOF)
{
for(i=1;i<=N;i++)
Q.push(i);
while(Q.size()>1)
{
for(i=1;i<M;i++)
{
int x=Q.front();
Q.pop();
Q.push(x);
}
Q.pop();
}
printf("%d\n",Q.front());
}
return 0;
}