https://noi.vip/problem/1034选警长

题目链接:https://noi.vip/problem/1034
警队有N个人排成一队,从第1个人开始依次顺序报号一遍,凡报号为M和M的倍数者退出队伍。
如果一次报号中没有报号为M和M倍数者,则从第一个人接续报号,保证每次从队伍中退出一人。 然后再重新从第一个人开始依次报号一遍,重复上述过程,直到队伍中剩余最后一人。

找出最后一个留在队伍的警长的序号
输入样例:

5 3

输出样例:

2

求C++代码

意思是如果一次报号中有M或M的倍数,下一遍就不是第一个人接续报号了?

#include <iostream>
using namespace std;
#include <string.h>

int main()
{
    int M,N,i;
    cin>>N>>M;
    int *out = new int[N];
    memset(out,0,N*sizeof(int));
    int count = 0,num = 0;
    do
    {
        count = 0;
        for(i=0;i<N;i++)
        {
            if(!out[i])
            {
                count++;
                if(count % M == 0)
                    out[i] = 1;
            }
        }
    }while(count >= M);
    //
    do
    {
        count = 0;
        for(i=0;i<M-1;i++)
        {
            if(!out[i])
            {
                count++;
                num++;
                if(num%M==0)
                {
                    out[i] = 1;
                    num = 0;
                }
            }
        }
    }while(count > 1);
    //
    for(i=0;i<N;i++)
        if(!out[i])
        {
            cout<<i+1;
            break;
        }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632