军训队列
作者:互联网
题目描述(动态规划)
某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的依次向前靠拢,继续从头开始进行一至二报数。。。以后每次从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
输入
第一行为组数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()
标签:从头开始,队列,一至,ls,出列,报数,军训,进行 来源: https://www.cnblogs.com/wisteria68/p/12380092.html