0
点赞
收藏
分享

微信扫一扫

AcWing 4400. 玩游戏 (模拟)

Sikj_6590 2022-04-17 阅读 52
c++算法

nn 个小朋友围成一圈,玩数数游戏。

小朋友们按顺时针顺序,依次编号为 1∼n1∼n。

初始时,11 号小朋友被指定为领头人。

游戏一共会行进 kk 轮。

在第 ii 轮中,领头人会从他的顺时针方向的下一个人开始,按顺时针顺序数 aiai 个人。

其中,最后一个被领头人数到的人被淘汰出局,这也意味着该轮游戏结束。

出局者的顺时针方向的下一个人被指定为新领头人,引领新一轮游戏。

例如,假设当游戏即将开始第 ii 轮时,还剩下 55 个小朋友,编号按顺时针顺序依次为 8,10,13,14,168,10,13,14,16,并且当前领头人为 1313 号小朋友,ai=12ai=12,则第 ii 轮游戏结束后,最后一个被数到的小朋友为 1616 号小朋友,他将被淘汰出局,并且处于其下一位的第 88 号小朋友将被指定为新领头人。

现在,请你求出每一轮次被淘汰的小朋友的编号。

输入格式

第一行包含两个整数 n,kn,k。

第二行包含 kk 个整数 a1,a2,…,aka1,a2,…,ak。

输出格式

一行,kk 个整数,其中第 ii 个整数表示在第 ii 轮中被淘汰的小朋友的编号。

数据范围

前三个测试点满足 2≤n≤102≤n≤10。
所有测试点满足 2≤n≤1002≤n≤100,1≤k≤n−11≤k≤n−1,1≤ai≤1091≤ai≤109。

输入样例1:

7 5
10 4 11 4 1

输出样例1:

4 2 5 6 1

输入样例2:

3 2
2 5

输出样例2:

3 2

代码如下:

#include<iostream>
#include<vector>
using namespace std;
int n, k, s;
int a[105];
vector<int> v, res;

int main() {
    ios::sync_with_stdio(false);
    cout.tie(nullptr);

    cin >> n >> k;
    for(int i = 1; i <= n; i ++) v.push_back(i);
    for(int i = k; i >= 1; i --) cin >> a[i];

    while(k) {
        int temp = (s + a[k]) % v.size();  // 被淘汰的人的位置
        res.push_back(v[temp]);  // 存入被淘汰人的编号
        s = temp % (v.size() - 1);  // 新领头人的位置
        v.erase(v.begin() + temp); // 删除被淘汰人
        k --; // 下一轮
    }
    
    for(int i = 0; i < res.size(); i ++)    cout << res[i] << " ";

    return 0;
}
举报

相关推荐

0 条评论