CodeForce-792B Counting-out Rhyme(模拟)

Counting-out Rhyme

CodeForces - 792B

题意:

n 个孩子在玩一个游戏。 孩子们站成一圈,按照顺时针顺序分别被标号为 1 到 n。开始游戏时,第一个孩子成为领导。 游戏进行 k 轮。 在第 i 轮中,领导会从他顺时针方向下一个孩子开始数 ai 个孩子。最后数到的那个孩子出局,再下一个孩子成为新的领导。

举个例子, 现在圈内还剩 [8, 10, 13, 14, 16] 4个孩子,领导编号为 13 , ai = 12。那么出局的孩子为 16 。第 8 个孩子成为下一个领导。

你需要写一个代码模拟这个过程,求出每轮比赛出局的孩子。

Input

第一行包含两个整数 nk (2 ≤ n ≤ 100, 1 ≤ k ≤ n - 1).

第二行包含 k 个整数 a1, a2, ..., ak (1 ≤ ai ≤ 109).

Output

输出 k 个整数,第 i 个整数表示第 i轮出局的孩子。

直接模拟一遍就好,对于k轮中的每一轮,先计算要往后数多少个人,找出出局者,然后再往后找新的领导者,重复循环即可。

#include<iostream>
using namespace std;
#define maxn 110
int a[maxn]={0};
int main()
{
    int n,k,x;
    cin>>n>>k;
    int cnt,first=1,ans;
    for(int j=0;j<k;j++)
    {
        cin>>x;
        cnt=x%(n-j);//n-j表示本轮还剩n-j个人
        if(cnt==0)//出局者是领导者自己
            cnt=n-j;
        for(int i=first+1;;i++)
        {
            if(i>n)
                i=1;
            if(a[i]==0)
                cnt--;
            if(cnt==0)//找到最后一个人
            {
                a[i]=1;
                ans=i;
                for(int l=i+1;;l++)//寻找下一个领导者
                {
                    if(l>n)
                        l=1;
                    if(!a[l])
                    {
                        first=l;
                        break;
                    }
                }
                break;
            }
        }
        cout<<ans<<" ";
    }
    return 0;
}
原文地址:https://www.cnblogs.com/YingZhixin/p/7105160.html