题目大意:
猴子选大王。 n只猴子围成一圈,顺时针方向从1到n编号。之后从1号开始沿顺时针方向让猴子从1,2,…,m依次报数,凡报到m的猴子,都让其出圈,取消候选资格。然后不停地按顺时针方向逐一让报出m者出圈,最后剩下一个就是猴王。
代码实现:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
struct monkey
{
int num;
monkey *next;
};
struct monkey *head,*tail;
void creat(int nn)
{
int i;
struct monkey *p,*q;
p->num=1;
p->next=NULL;
head=p;
q=p;
for(i=2;i<=nn;i++)
{
p=new monkey;
p->num=i;
q->next=p;
q=p;
p->next=NULL;
}
tail=q;
tail->next=head;
}
void select(int mm)
{
int x=0;
struct monkey *p,*q;
q=tail;
do
{
p=q->next;
x++;
if(x%mm==0)
{
q->next=p->next;
delete p;
}
else
q=p;
}while(q!=q->next);
head=q;
}
int main()
{
int m,n;
cin>>n>>m;
creat(n);
select(m);
cout<<head->num<<endl;
}