la3882(约瑟夫问题的变种)

578 篇文章 ¥299.90 ¥399.90
570 篇文章 ¥299.90 ¥399.90
该问题是对经典约瑟夫问题的拓展,输入包含n、k、m三个整数,当n=k=m=0时结束。问题要求找到当从m开始,每隔k个数删除一个,直到只剩下一个数时,这个最后剩余的数是多少。通过递推法可以解决,以O(n)的时间复杂度求解f(n),其中f(n)=(f(n-1)+k)%n,f(1)=0表示初始状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

n个数排成一个圈。第一次删除m,以后每数k个数删除一次,求最
个被删除的数。当n=8,k=5,m=3时,删数过程如图1-41所示。
图 1-41
输入格式】

输入包含多组数据。每组数据包含3个整数n,k,m(2≤n≤10000,

1≤k≤10000,1≤m≤n)。输入结束标志为n=k=m=0。
【输出格式】
对于每组数据,输出最后一个被删除的数。

【分析】
本题是约瑟夫问题的变种,唯一的区别就是:原版问题中,从1开始
数数,而在本题中,规定第一个删除的数是m。约瑟夫问题作为链表的经
典应用,出现在很多数据结构与程序设计语言的书籍中。可惜链表法的
时间复杂度为O(nk),无法承受本题这样大的规模。
如果像本题这样只关心最后一个被删除的编号,而不需要完整的删
除顺序,则可以用递推法求解。假设编号为0~n-1的n个数排成一圈,从
0开始每k个数删除一个,最后留下的数字编号记为f(n),则f(1)=
0ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值