想到使用两个数组,数组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;
}



京公网安备 11010502036488号