孩子们的游戏(圆圈中最后剩下的数)
- 参与人数: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 */
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-09 06:19:40