4400 玩游戏(约瑟夫环、模拟)

1. 问题描述:

n 个小朋友围成一圈,玩数数游戏。小朋友们按顺时针顺序,依次编号为 1∼n。初始时,1 号小朋友被指定为领头人。游戏一共会行进 k 轮。在第 i 轮中,领头人会从他的顺时针方向的下一个人开始,按顺时针顺序数 ai 个人。其中,最后一个被领头人数到的人被淘汰出局,这也意味着该轮游戏结束。出局者的顺时针方向的下一个人被指定为新领头人,引领新一轮游戏。
例如,假设当游戏即将开始第 i 轮时,还剩下 5 个小朋友,编号按顺时针顺序依次为 8,10,13,14,16,并且当前领头人为 13 号小朋友,ai = 12,则第 i 轮游戏结束后,最后一个被数到的小朋友为 16 号小朋友,他将被淘汰出局,并且处于其下一位的第 8 号小朋友将被指定为新领头人。现在,请你求出每一轮次被淘汰的小朋友的编号。

输入格式

第一行包含两个整数 n,k。第二行包含 k 个整数 a1,a2,…,ak。

输出格式

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

数据范围

前三个测试点满足 2 ≤ n ≤ 10;
所有测试点满足 2 ≤ n ≤ 100,1 ≤ k ≤ n − 1,1 ≤ ai ≤ 10 ^ 9;

输入样例1:

7 5
10 4 11 4 1

输出样例1:

4 2 5 6 1

输入样例2:

3 2
2 5

输出样例2:

3 2
来源:https://www.acwing.com/problem/content/4403/

2. 思路分析:

分析题目可以知道这道题目属于经典的约瑟夫环问题,可以使用 dp 或者模拟来解决,由于数据范围不大,所以我们可以直接使用数组或者队列来模拟整个过程即可。

3. 代码如下:

python:

class Solution:
    def process(self):
        n, m = map(int, input().split())
        q = [i for i in range(1, n + 1)]
        a = list(map(int, input().split()))
        for x in a:
            x %= len(q)
            for i in range(x):
                q.append(q.pop(0))
            print(q[0], end=" ")
            q.pop(0)


if __name__ == "__main__":
    Solution().process()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值