zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    np背包问题【算法:折半枚举】
    数字游戏【后缀积问题,一个数学分析问题】
    bfs求最短路径
    利用费马小定理求逆元
    [蓝桥杯2016初赛]剪邮票【全排列,连通块】
    np背包问题【算法:折半枚举】
    火星救[数学,一点前缀和]
    bfs求最短路径
    检测一个正整数是否是2的N次方
    IIS与asp.net身份认证
  • 原文地址:https://www.cnblogs.com/YingZhixin/p/7105160.html
Copyright © 2011-2022 走看看