描述:
某皇帝有2m个儿子,现在要从中选出一个做太子,皇帝不知道该把那一个皇子立为太子,于是决定用下面的方法来选出太子,设每个太子的编号分别1、2、3、…、2m,按顺时针方向站成一个圆圈,现在从1号太子开始按顺时针方向数,数到第n个人,把他淘汰出局,然后从他的下一个人开始上述过程,当第m个人被淘汰时,转变方向继续从1开始数,重复上述过程,最后剩下的皇子将被立为太子。现在请你写一个程序,计算出几号皇子将被立为太子。
输入:
输入两个正整数m n
Input two positive integer.
输出:
输出太子的编号
Output the number
题解
一个裸的模拟题
这个题貌似是可以用指针做,让尾指针指向头指针构造一个循环数列,然后模拟。然而我不会指针。。。
所以我用了一个队列queue模拟,先把2m个数都按顺序扔进去,取一个计数器cnt从1开始++每次%n==0说明该淘汰人了,每次从队列头取一个数,代表数到他了,如果此时cnt%n!=0就再把他丢回对尾,如果cnt%n==0就不管他了,中间变方向就是把此时队列里所有的数都按顺序取出来再反向放进去,然后接着模拟,最后一个出来的就是太子辣
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
int a[10010];
int n,m,ji=1,sum=0;
queue<int> q;
int main()
{
int now;
cin>>m>>n;
for(int i=1;i<=m*2;i++)
q.push(i);
while(ji<=m)
{
sum++;
now=q.front();
q.pop();
if(sum%n!=0)
{
q.push(now);
}
else
ji++;
}
for(int i=1;i<=m;i++)
{
a[i]=q.front();
q.pop();
}
for(int i=m;i>=1;i--)
{
//cout<<a[i]<<" ";
q.push(a[i]);
}
ji=1,sum=0;
while(ji<m)
{
sum++;
now=q.front();
q.pop();
if(sum%n!=0)
{
q.push(now);
}
else
ji++;
}
now=q.front();
cout<<now<<endl;
return 0;
}