2.报数游戏

■ 题目描述
100个人围成一圈,每个人有一个编码,编号从1开始到100。他们从1开始依次报数,报到为M的人自动退出圈圈,
然后下一个人接着从1开始报数,直到剩余的人数小于M。请问最后剩余的人在原先的编号为多少?
输入描述:
输入一个整数参数 M
输出描述:
如果输入参数M小于等于1或者大于等于100,输出“ERROR!”;
否则按照原先的编号从小到大的顺序,以英文逗号分割输出编号字符串
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
输出
58,91
说明
输入M为3,最后剩下两个人。
示例2 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
4
输出
34,45,97
说明
输入M为4,最后剩下三个人。

这道题我用的队列的思想,每次都把前面的编号弹出,只要弹出的人不是第M个,就把那个人的编号重新加到队列尾部,直到队列长度小于M,退出循环

from collections import deque

M = int(input())
if M <= 1&nbs***bsp;M >= 100: # 先根据题目进行输入不合法的异常处理
    print("ERROR!")   # 这里刚开始还没注意,感叹号没加导致用例通过率只有百分之80,后面才改了
else:
    arr = [i for i in range(1, 101)]
    queue = deque()
    queue.extend(arr)
    while len(queue) >= M:
        for i in range(M):
            num = queue.popleft()
            if i != M-1:
                queue.append(num)
    res = []
    for j in queue:
        res.append(j)
    res.sort()
    print(",".join([str(x) for x in res]))



#华为机试#
全部评论
典型的约瑟夫环问题,看数据量可以直接模拟,如果数据量大模拟就过不了了,得用动态规划,分析清楚写出递推公式即可
点赞 回复 分享
发布于 2023-02-04 23:40 四川

相关推荐

1 6 评论
分享
牛客网
牛客企业服务