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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FLAG_ACTIVITY_NEW_TASK谨慎使用「建议收藏」

    FLAG_ACTIVITY_NEW_TASK谨慎使用「建议收藏」前段时间在适配android权限的时候,遇到一问题1::在Activity的onCreate中去申请权限2:对申请结果进行判断,如果全部拒绝了权限,则弹出退出或者是去设置中打开权限其中点击设置中打开权限的时候启动activity时添加NEW_TASKTAG.并且对返回结果进行判断,如果仍然没有权限的时候,程序直接finish结果用户点击了设置-权限,去打开或者关闭权限,并且按back键返回后,a…

    2022年10月6日
  • tree命令详解

    tree命令详解命令:tree命令说明:以树状格式列出目录的内容,查看文件系统的结构命令用法:tree[选项]…[文件]…参数说明:参数参数说明备注-a打印所有文件,包括隐藏文件、目录-C在文件和目录清单上加上色彩,便于区分文件类型-d仅列出目录名称,而非内容-D列出文件或目录更改时间-L目录树的最大显示深度-p打印结构同时打印文件权限-l跟随目录的符号链接,就像它们是目录一样。避免了导致递归循环的链接-f打印每个

    2022年7月25日
  • Linux加密initramfs,initramfs 製作方式

    Linux加密initramfs,initramfs 製作方式Linuxkernel在自身初始化完成之后,需要能够找到并运行第一个用户程序(这个程序通常叫做“init”程序)。用户程序存在于文件系统之中,因此,内核必须找到并挂载一个文件系统才可以成功完成系统的引导过程。在grub中提供了一个选项“root=”用来指定第一个文件系统,但随着硬件的发展,很多情况下这个文件系统也许是存放在USB设备,SCSI设备等等多种多样的设备之上,如果需要正确引导,US…

    2022年8月11日
  • AutoFac使用

    AutoFac使用AutoFac使用方法设置读取配置文件的方法AutoFacConfig.cs:需要安装引用Autofac3.5.2Autofac.Configuration3.3.0=&gt;ConfigurationSettingsReaderAutofac.Owin4.0.0Autofac.WebApi24.1.0Autofac.WebApi2.Owin4.0.0代码publicsta…

    2022年10月27日
  • vmware虚拟机(四)之安装centos7图形界面Linux

    vmware虚拟机(四)之安装centos7图形界面Linux1.创建新的虚拟机2.根据提示一步一步操作,这里可以选择推荐的,也可以选择自定义3.虚拟机硬件兼容性一般选择默认的,即次虚拟机支持的最新版本,下面是一些兼容产品和限制,此虚拟机可安装的最大内存为64GB,处理器数目最多为16个。。。。4.为了练习安装Linux操作系统,我们选择稍后安装操作系统5.根据自己需要的操作系统版本选择,这里我们选择centos64位的Linux6.虚…

    2022年5月27日
  • ODBC学习笔记—SQLAllocHandle

    ODBC学习笔记—SQLAllocHandleSQLAllocHandle函数定义:顾名思义,该函数就是用来分配句柄的,句柄类型参考参数详解。SQLRETURNSQLAllocHandle(     SQLSMALLINT     HandleType,     SQLHANDLE     InputHandle,     SQLHANDLE*     OutputHandlePtr);参数详解:Handl

    2022年7月14日

发表回复

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

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