孩子们的游戏(圆圈中最后剩下的数)
- 参与人数:604时间限制:1秒空间限制:32768K
- 通过比例:27.00%
- 最佳记录:0 ms|0K(来自 门前流水)
题目描述
每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为NowCoder的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到NowCoder名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?
结合题意:就是n个人从0连续编号到n-1,然后围成一圈,给一个m每次第m个人退出圈,接着往后,这个就是模拟链表删除结点,最后剩下的就是目标结点;
题目不难,注意细节,比如m<=0;n<=0之类的,这些都是要自己考虑的,即使题目没说;
我之前做过一个技巧性更强的题:http://www.cnblogs.com/yuyixingkong/p/3254566.html 有兴趣的可以看下;
#include<stdio.h>
#include<stdlib.h>
typedef struct List {
int val;
struct List *next;
List(int x) : val(x),next(NULL) {}
}List;
class Solution {
public:
int LastRemaining_Solution(unsigned int n, unsigned int m)
{
if(n==0||m==0) return -1;
if(m==1)return n-1;
List *L,*p;
L=CreatList(L,n);
int k=0;
while(L)
{
// printf("k=%d\n",k);
k++;
if(k%m==0)
{
p->next=L->next;
// printf("-----%d\n",L->val);
free(L);
L=p->next;
k=1;
}
p=L;
L=L->next;
if(p==L) return p->val;
}
}
List* CreatList(List *pHead,int n)
{
if(n==0) return NULL;
List *p,*q;
pHead=new List(NULL);
p=pHead;
int xx=0;
p->val=xx;
while(--n)
{
q=new List(++xx);
p->next=q;
p=q;
}
p->next=pHead;
return pHead;
}
};
int main()
{
Solution so;
int n,m;
scanf("%d%d",&n,&m);
int ans=so.LastRemaining_Solution(n,m);
printf("%d\n",ans);
return 0;
}
/*
测试用例:
0,0
对应输出应该为:
-1
*/