http://acm.nyist.net/JudgeOnline/problem.php?pid=278
排队
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
周末了,软件ACM的队员准备玩玩游戏,娱乐一下,CY想了一个好主意,所有队员站成一个圈,从1开始报数,凡是报出指定数字的人要出列,有人出列后,下个人重新从1开始报数。最后一位“幸存者”要给大家表演个节目。由于队员正在不断的壮大,C小加又想知道他是否需要准备表演,请你设计个程序,帮他确定他是否是“幸存者”。
-
输入
- 第一行是n,有n次游戏,第二行是m,x,表示某次游戏有m个人,指定被请出列的数字为x。其中n<100,m<1000 输出
- 最后幸存的那位的原来的号码 样例输入
-
2 10 5 6 4
样例输出
-
3 5
#include<stdio.h>
#include<string.h>
#include<malloc.h>
struct Node
{
int data;
struct Node *link;
};
int main()
{
int N,n,m,i,j,k;
scanf("%d",&N);
while(N--)
{
scanf("%d %d",&n,&m);
//=====如果m为1,则直接输出=====//
if(m==1)
{
printf("%d\n",n);
continue;
}
//==============================//
//-----创建头结点-----//
struct Node *head;
head=(struct Node *)malloc(sizeof(struct Node));
head->data=1;
head->link=NULL;
//--------------------//
struct Node *p=head;
for(i=1;i<=n;i++)
{
if(i==1)
continue;
else if(1<i&&i<n)
{
//-----创建节点-----//
struct Node *s;
s=(struct Node *)malloc(sizeof(struct Node));
s->data=i;
s->link=NULL;
//------------------//
p->link=s;
p=p->link;
}
else if(i==n)
{
struct Node *s;
s=(struct Node *)malloc(sizeof(struct Node));
s->data=n;
s->link=head;
p->link=s;
}
}//创建循环链表成功
p=head;
while(!(p->link->data==p->data))
{
for(i=1;i<m-1;i++)
{
p=p->link;
}
p->link=p->link->link;
p=p->link;
}
printf("%d\n",p->data);
}
return 0;
}