想到使用两个数组,数组a存储当前还在队中的人员编号,数组b存储某编号人员当前的报数,一旦有人报到m,即让该人出队(使用erase删除数组a中的该人编号)。由于队中最后一人报数后,重新轮到第一人报数,故边界问题要处理好。

#include <iostream>
#include <vector>
using namespace std;
int main(){
    int n,k,m,d;
    cin>>n>>k>>m;
    vector<int> a;
    vector<int> b(n);
    for(int i=0;i<n;i++)
        a.push_back(i);
    b[k]=1;
    d=k;                               //d指示数组a的索引
    while(a.size()>1){
        while(b[a[d]]!=m){
            if(d==a.size()-1){        //当最后一人报完数后,轮到第一人报数。
                d=0;
                b[a[d]]=b[a[a.size()-1]]+1;
            }
            else{
                d++;
                b[a[d]]=b[a[d-1]]+1;
            }
        }
        a.erase(a.begin()+d);          //删除数组a中索引为d的元素,a.size()会减少1.
        if(d==a.size()){
            d=0;
            b[a[d]]=1;                 //若被删除的人是该队中最后一人,则其后一人重新回到第一人。
        }
        else b[a[d]]=1;
    }
    cout<<a[0];
    return 0;
}