欢迎访问mehome的博客

Tomorrow is another day.
Fork me on GitHub

ccf 201712-2 游戏(Python实现)

一、原题

 

问题描述

试题编号:

201712-2

试题名称:

游戏

时间限制:

1.0s

内存限制:

256.0MB

问题描述:

问题描述

  有n个小朋友围成一圈玩游戏,小朋友从1n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……1号小朋友坐在n号小朋友的顺时针方向。
  游戏开始,从1号小朋友开始顺时针报数,接下来每个小朋友的报数是上一个小朋友报的数加1。若一个小朋友报的数为k的倍数或其末位数(即数的个位)为k,则该小朋友被淘汰出局,不再参加以后的报数。当游戏中只剩下一个小朋友时,该小朋友获胜。
  例如,当n=5, k=2时:
  1号小朋友报数1
  2号小朋友报数2淘汰;
  3号小朋友报数3
  4号小朋友报数4淘汰;
  5号小朋友报数5
  1号小朋友报数6淘汰;
  3号小朋友报数7
  5号小朋友报数8淘汰;
  3号小朋友获胜。

  给定nk,请问最后获胜的小朋友编号为多少?

输入格式

  输入一行,包括两个整数nk,意义如题目所述。

输出格式

  输出一行,包含一个整数,表示获胜的小朋友编号。

样例输入

5 2

样例输出

3

样例输入

7 3

样例输出

4

数据规模和约定

  对于所有评测用例,1 ≤ n ≤ 10001 ≤ k ≤ 9

 

二、题解

用到两个列表和一个计数器。计数器用来记录当前小朋友的报数。第一个列表用来装没有报数的小孩。第二个列表用来装报数并且不是k的整数倍的小孩。当第一个列表循环完一遍以后,把第二个列表重新复制给第一个列表。然后第二个列表置空。然后循环第二遍。当第一个列表长度是1时停止循环。然后输出当前小孩的序号。

注意:

  1. 用range生成时,Python3是生成一个迭代器。所以需要用list来实际在内存生成这个列表。然后是这个列表的每个元素对应的小孩应该是这个数字加1(或者range生成列表从1开始到n+1)才是小孩的真正序号。
  2. 题中有两点儿要求:一是小朋友数到k时淘汰;二是小朋友报数的个位数为k时小朋友也被淘汰。

三、代码

  • 以下提交20分:
L = list(map(int,input().split()))
n, k = L[0], L[1]
li = list(range(n))
c = 1
while len(li) > 1:
    li1 = []
    for i in range(len(li)):
        if c%k==0:
            c += 1
        else:
            li1.append(li[i])
            c += 1
    li = li1[:]
print(li[0]+1)
  • 修改后提交得30分:
L = list(input().split())
n, k = int(L[0]), int(L[1])
li = list(range(1,n+1))
c = 1
while len(li) > 1:
    li1 = []
    
    #之前没有考虑到k=1
    if k == 1:
        li1.append(li[-1])
        li = li1[:]
        break
    for i in range(len(li)):
        if c%k==0:
            c += 1
        else:
            li1.append(li[i])
            c += 1
    li = li1[:]
print(li[0])
  • 认真审题以后发现还有报数的个位数为K时也会淘汰。所以更改如下:
L = list(input().split())
n, k = int(L[0]), int(L[1])
li = list(range(1,n+1))
c = 1
while len(li) > 1:
    li1 = []
    
    #之前没有考虑到k=1
    if k == 1:
        li1.append(li[-1])
        li = li1[:]
        break
    for i in range(len(li)):
	#之前没有考虑个位数为k
        if (c%k==0) or (c%10==k):
            c += 1
        else:
            li1.append(li[i])
            c += 1
    li = li1[:]
print(li[0])
posted @ 2018-08-24 18:04  mehome  阅读(1253)  评论(0编辑  收藏  举报