ccf 201712-2 游戏(Python实现)
一、原题
问题描述
试题编号: |
201712-2 |
试题名称: |
游戏 |
时间限制: |
1.0s |
内存限制: |
256.0MB |
问题描述: |
问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。 输入格式 输入一行,包括两个整数n和k,意义如题目所述。 输出格式 输出一行,包含一个整数,表示获胜的小朋友编号。 样例输入 5 2 样例输出 3 样例输入 7 3 样例输出 4 数据规模和约定 对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。 |
二、题解
用到两个列表和一个计数器。计数器用来记录当前小朋友的报数。第一个列表用来装没有报数的小孩。第二个列表用来装报数并且不是k的整数倍的小孩。当第一个列表循环完一遍以后,把第二个列表重新复制给第一个列表。然后第二个列表置空。然后循环第二遍。当第一个列表长度是1时停止循环。然后输出当前小孩的序号。
注意:
- 用range生成时,Python3是生成一个迭代器。所以需要用list来实际在内存生成这个列表。然后是这个列表的每个元素对应的小孩应该是这个数字加1(或者range生成列表从1开始到n+1)才是小孩的真正序号。
- 题中有两点儿要求:一是小朋友数到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])
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。