又是健忘的一天哈,题号不记得了,sorry sorry 。(我又来发库存了)
目录
题目:
某班级男生人数为X人,女生人数为Y人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(从1到X+Y)。现给出一个正整数K(2<K<(X+Y)),从编号为1的同学开始顺时针方向报数,报到K的同学退出圆圈,下一名同学继续从1报数,再次报到K的同学退出圆圈。如此循环,直到剩余人数为X时游戏结束。
请你计算出游戏开始时X名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余X人都是男生。并将游戏开始时每名男生的位置编号按照从小到大顺序输出。
例如:X=5,Y=3,K=3,8名同学按照如下顺序排列,可以使3轮报数过后最后剩余的5名同学都为男生(蓝色为男生位置,红色为女生位置)。
故5名男同学的编号分别为2,4,5,7,8。
输入描述
输入三个正整数X,Y,K(3≤X≤100,3≤Y≤100,2<K<(X+Y)),X表示男生人数,Y表示女生人数,报数为K的同学退出圆圈,三个正整数之间以一个空格隔开
输出描述
将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开
样例输入
5 3 3
样例输出
2 4 5 7 8
(感谢@SHARHS@HENRY友友的题目支持)
思路
在以前,我写了下面的文章。现在的题,是它的进阶版。下面的文章是介绍如何只留最终的胜利者,而现在我们要留的是所有的男生。其实不要被男生这个词框住,细想来,其实只是要留下男生数量的人罢了。所以在遍历的条件上我们要进行一些改动。
重中之重:出局小朋友的索引号=(出局小朋友的索引号+数到几出局)%小孩们总数-1
代码
def fn(n,K,X): # 定义一个函数,n参数是所有小朋友的人数,K是数到几出局,X是要剩几个人
t=0 # t代表索引号
l=list(range(1,n+1)) # 定义一个列表,代表所有小朋友
if n==1: # 如果你只有一个小朋友就别玩了,直接返回l就好了
return l
for i in range(n-X): # 要遍历n-X次,才能保证最后会剩X人
t=(t+K)%len(l)-1 # 这种题的要点就是这个,记好吧,t就等于要出局的小朋友的索引号
del l[t] # t索引对应的小朋友出局啦
if t<0: # 如果t到头了
t=0 # 再从头开始
return l # 最终返回幸存小朋友编号,也就是如果想都是男生,男生坐的位置
j=list(eval(input())) # 输入
X=j[0] # X是男生人数
Y=j[1] # Y是女生人数
K=j[2] # Z是数到几出局
l=fn(X+Y,K,X) # 调用函数 一共有X+Y个小朋友,数到Z出局,要剩男生的人数
print(','.join([str(i) for i in l])) # 最后把结果输出
小结
有些题真的是让人匪夷所思。你只能背下来。考试前的做题量是十分重要的。最后,还是祝各位拥有美好的一天,拥有灿烂的前程