zoukankan      html  css  js  c++  java
  • 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])
  • 相关阅读:
    SDUT2136 数据结构实验之二叉树的建立与遍历
    工作流之任务处理人更改
    【转】工作感悟:为什么我们专业但不职业?
    我们为什么要使用工作流——业务流程重组与企业现代化管理<转>
    .net生成图片缩略图
    RIA Services Visual Studio 2008 SP1 中文版不能安装解决方法
    SQL Server数据库链接方式
    常用端口号
    XSD是什么
    新版.NET 程序员必备工具下载
  • 原文地址:https://www.cnblogs.com/mehome/p/9531292.html
Copyright © 2011-2022 走看看