军训队列

题目描述(动态规划)

某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的依次向前靠拢,继续从头开始进行一至二报数。。。以后每次从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

输入

第一行为组数N,接着为N行学生人数,学生人数不超过5000。

输出

输出有N行,分别对应输入的学生人数,每行输出剩下的学生最初的编号,编号之间有一个空格。

样例输入

2
20
40

样例输出

1 7 19
1 19 37

破题思路

主要函数:按每2个出列的函数、每3个出列的函数。
相关技巧:设置哨兵,每进行一次循环将哨兵进行取反操作,辅助交替按每2个出列和每3个出列。
其它设置:ls[开始索引:结束索引:步长],默认设置:开始索引=0,结束索引=len(ls),步长=1。

程序源码

N = int(input())
ms = [int(input()) for _ in range(N)]
for m in ms:
#将i变为i+1,人员编号从1开始
ls = [i + 1 for i in range(m)]
#设置哨兵,每进行一次循环将f值进行取反操作,辅助交替按每2个出列和每3个出列
    f = True
while len(ls) > 3:
#ls[::2]:表示按每2个进行出列的规则进行筛选时,所剩下的元素。
        ls = ls[::2] if f else [x for i, x in enumerate(ls) if (i + 1) % 3]
        f = not f
    for i in ls:
        print(i, end=' ')
print()
原文地址:https://www.cnblogs.com/wisteria68/p/12380092.html