【蓝桥杯】约瑟夫环(第九届蓝桥杯大赛个人赛决赛(软件类)真题)

题目描述

n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。

本题目就是已知 n,k 的情况下,求最后剩下的人的编号。

题目的输入是一行,2个空格分开的整数n, k
要求输出一个整数,表示最后剩下的人的编号。

约定:0 < n,k < 1百万

例如输入:
10 3

程序应该输出:
4

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms

解题思路

没做过约瑟夫环这类题目,现学了一下。时间要求为1s,数据量为1e6,只能O(n)。

设f(n,k)为1-n个人每次去掉第k个人最终剩下的人的编号,可推导得到下式:

f(n,k)=(f(n-1,k)+k)%n

递归做法在这题里不行,得用高效的数组做法。

代码(未经检验,如有错误,欢迎指正)

n,k=int(input()),int(input())
#递归做法
# def f(n,k):
	# if n==2:
		# if k%2==0:
			# return 1
		# else:
			# return 2
	# else:
		# s=(f(n-1,k)+k)%n
		# if s==0:
			# s+=1
		# return s
# print(f(int(n),int(k)))

#数组做法
ans=1
if k%2==1:
	ans+=1
for i in range(3,n):
	ans=(ans+k)%n
	if ans==0:
		ans=1
print(ans)

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值