2017.12.2 游戏
目录
前言
最近我在做CCF的题目,也打算把每道题的解题思路都写到博客上来,希望能帮助到也在做CCF题目的读者们,希望你们通过本文能有所提示,帮助大家提升编程能力。另外有个很好的想法就是,建议读者们可以先看一下问题分析的部分,然后自己再整理一下思路,重新做一遍,最后再参考代码,我想这样会更有收获。
一、问题描述
问题描述
有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表示存活,0表示淘汰;并且用一个变量 total 计算列表的和
②用一个变量num模拟报数,遍历n个元素,判断存活状态,存活的人才能报数,淘汰的人不可报数;同时判断报的数值是否能否整除k,或者其个位数是否等于k,符合该条件则将该元素淘汰,替换为0
③建立外层循环,此循环判断列表的和是否等于1,即只剩下最后一个人时,循环结束
④找出最后存活的人的下标,输出下标+1的值即为结果
三、程序说明
n:输入n个人,1表示存活,0表示淘汰
k:输入淘汰数字,凡是k的倍数或其末位数(即数的个位)为k,则这个人被淘汰出局
a:存储n个人的存活状态
total:计算列表a的和
num:模拟报数,存活的人才能报数,淘汰的人不允许报数
index:找出最后存活的人的下标
python语言的程序如下(100分):
# 游戏
s = input().split()
n = int(s[0])
k = int(s[1])
a = [1 for i in range(0,n)] # 有n个人,1表示存活,0表示淘汰
total = sum(a)
num = 0
while total > 1:
for i in range(0,len(a)):
if a[i] != 0:
num += 1
if (num % k == 0) or (num % 10 == k):
a[i] = 0
total = sum(a)
if total == 1:
break
index = a.index(1) # 找出1的下标
print(index+1)