【题目】http://codeforces.com/problemset/problem/792/B
【题意】n个人围成一个圈,开始队长是1,每次从他后面数ai个人,最后数到的人出局,出局人的下一个人当队长,按顺序输出每次出局的人。
【思路】队列模拟,数过去的人就从队首移到队尾,出局的人就输出pop。
注意用数的人数对圈里的人数取余来加速。注意队长不能直接移动过去,他可能数了一圈数到了自己。
【代码】
#include<bits/stdc++.h>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;
const int M=2e5+5;
const int inf=1e9+5;
int a[105];
queue<int>q;
int main()
{
int n,m;
cin>>n>>m;
for(int i=0; i<m; i++)
{
cin>>a[i];
}
for(int i=1; i<=n; i++)
{
q.push(i);
}
int now=n;//记录现在圈里还有多少人
for(int i=0; i<m; i++)
{
//每次循环队首是队长
int t=a[i]%now;//数多少个人
//这里不能提前将队长放到队尾,因为当t=0时,队长把自己搞出局了
//从下一个人开始数t个人第t个出局
//相当于从自己开始数,数t个人安全,下一个人出局
for(int j=0; j<t; j++)
{
q.push(q.front());//t个人安全
q.pop();
}
cout<<q.front()<<" ";//下一个出局
q.pop();
now--;
}
return 0;
}