Python入门习题(40)——CCF CSP认证考试真题:报数游戏「建议收藏」

Python入门习题(40)——CCF CSP认证考试真题:报数游戏「建议收藏」CCFCSP认证考试真题(201712-2):游戏问题描述解题思路参考答案测试用例小结问题描述试题编号: 201712-2试题名称: 游戏时间限制: 1.0s内存限制: 256.0MB问题描述  有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向。  游戏开始,从1…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

CCF CSP认证考试真题(201712-2):游戏

问题描述

试题编号: 201712-2
试题名称: 游戏
时间限制: 1.0s
内存限制: 256.0MB

问题描述
  有n个小朋友围成一圈玩游戏,小朋友从1至n编号,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号小朋友获胜。

给定n和k,请问最后获胜的小朋友编号为多少?
输入格式
  输入一行,包括两个整数n和k,意义如题目所述。
输出格式
  输出一行,包含一个整数,表示获胜的小朋友编号。
样例输入
5 2
样例输出
3
样例输入
7 3
样例输出
4
数据规模和约定
  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 9。

解题思路

算法步骤是:

  1. 输入n, k

  2. if (k==1)
      输出n。
      程序结束。

  3. 为每一个小朋友生成两项数据,即(编号,报数值),组成队列。编号从左到右依次为1, 2, …, n。报数值初始化为0.

  4. 当前报数 = 0。

  5. while (队列人数大于1) {

      整个队列的小朋友从左到右报数,报的数记入小朋友自己的第二个数据项(即报数值);每报一个,当前报数递增1。
      队列中报的数是k的倍数或者个位是k的小朋友全部出列。
    }

参考答案

n, k = input().split()
n = int(n)
k = int(k)
if k == 1:
    print(n)
    exit(0)

count = 0
p_lst = [[i + 1, 0] for i in range(n)] #p_lst的每个元素有两项
        # 第一项是小朋友编号,第二项存的是该小朋友报的数

while len(p_lst) > 1:
    for p in p_lst:  #整支队伍从左到右报数
        count += 1    #报数
        p[1] = count  #记住小朋友报的数

    p_copy = p_lst[:]
    for p in p_copy:   #p_copy写作p_lst是错误的! p会发生游离!
        if p[1] % k == 0 or p[1] % 10 == k:
            p_lst.remove(p)  #小朋友报的数是k的倍数,或个位是k,出列

print(p_lst[0][0])

测试用例

  1. 题目描述给出的两组测试用覆盖的是一般情形。

  2. n=1的边界情形。
    样例输入
    1 5
    **样例输出
    1

  3. k=1的边界情形。
    样例输入
    5 1
    样例输出
    1
    在上一节给出的代码中,如果没有第4,5,6行,那么这个测试用例将无法通过。你知道为什么吗?

  4. 队列最右边一人出列的情形。
    样例输入
    5 5
    样例输出
    2

  5. 队列最左边一人出列的情形。
    样例输入
    5 6
    样例输出
    5

  6. n < k的情形。
    样例输入
    5 6
    样例输出
    5

  7. n=k的情形。
    样例输入
    5 5
    样例输出
    2

小结

  1. 遍历列表的循环中,不能删除列表的元素,否则将出现运行错误。
  2. 解答本题的方法有多种。上面给出的算法容易理解。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197573.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RePlugin集成AndroidAutoSize

    RePlugin集成AndroidAutoSize一、屏幕适配你可能会问“都2021年了还折腾屏幕适配?直接用dp单位适配不好吗?”,确实,如果公司的UI设计师、产品经理以及老板,能明白为什么一套UI在不同设备上显现出来的一些差异并不是bug时,开发者直接用dp单位配合一些布局技巧来进行适配是可以的,但是,实现多数情况下并不是如此美好,他们更希望看到的是UI在不同屏幕上,仅仅只是缩放的区别,为了满足这种要求,应用第三方屏幕适配方案就非常有必要了。根据在网上查到的比较好的原生屏幕适配方案有两种:smallestWidth

    2022年6月6日
    35
  • oracle sequence order_oracle session

    oracle sequence order_oracle session在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。  1、Create Sequence  你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,  CREATE SEQUEN

    2022年10月10日
    3
  • 用IDEA一年了,终于敢说自己会用了(IDEA配置和使用)[通俗易懂]

    作为Java老兵,我也是用了很多年的eclipse,为了与时俱进,于是切换到了IDEA。刚开始的时候感觉很不适应,感觉这玩意儿不如eclipse好用,影响工作效率,于是又换回eclipse。但是很多

    2022年2月16日
    49
  • ArrayList 和 LinkedList[通俗易懂]

    ArrayList 和 LinkedList[通俗易懂]ArrayList 和 LinkedList

    2022年4月22日
    40
  • Android如何下抓取tcp数据包[通俗易懂]

    如果要抓TCP数据包,我们可以使用TCPdump工具,具体方法是: 下载tcpdump,  还有个地址是http://www.strazzere.com/android/tcpdump,不知道具体版本。  详细使用请参考http://www.tcpdump.org/里

    2022年4月14日
    217
  • matlab griddata nan,请教Matlab的griddata的用法

    matlab griddata nan,请教Matlab的griddata的用法请教Matlab的griddata的用法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!请教Matlab的griddata的用法MATLAB散乱点插值函式griddata函式语法:ZI=griddata(x,y,z,XI,YI)[XI,YI,ZI]=griddata(x,y,z,XI,YI)[…]=gri…

    2022年5月9日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号