题目描述
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
思路:可以看做是一道数学题,找规律,写出通项公式即可;也可以模拟这个循环过程,关键是控制好下标
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<0||m<0) return -1;
int count = n;
int step = 0;//步长
int i = -1;因为是从0开始,所以初始设为-1
int * s = new int[n];//数组模仿一圈小朋友
while(count>0)
{
i++;
if(i>=n) i = 0;//如果下标超过你,则设为0
if(s[i]==-1) continue;//如果为-1,说明已经出列过了
step++;//路程+1
if(step==m)//如果路程==m
{
step = 0;//置0
s[i] = -1;
count--;//人数减1
}
}
return i;
}
};