【题目链接】
【题目分析】
本题是“约瑟夫问题”的升级版,约瑟夫问题的代码可参见君义_noip的博客。
本题与约瑟夫问题的区别在于,约瑟夫问题是数到k的人就出列,本题是数到a[i]的人就出列,需要使用一个数组a来记录从每一个人开始报数的报数次数。
本篇题解使用队列的方法完成。
【解题思路】
假设这n个人排成一队,在队头数人数,每数一个人,就让这个人出队,然后在队尾入队。数到第a[i]个人时,让该人出队,不再入队。重复上述过程,直到队列中仅剩一个人,并输出这个人的编号。
【题解代码】
解法1:使用C++ STL
#include<bits/stdc++.h>
using namespace std;
int n,a[1000010];
int main()
{
queue<int> que;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
que.push(i);
}
while(que.size()!=1)
{
int m=a[que.front()];
for(int j=1;j<=m-1;j++)
{
que.push(que.front());
que.pop();
}
que.pop();
}
cout<<que.front();
return 0;
}