P1996 约瑟夫问题-题解(队列??明明是单循环链好吗)

一如既往的题目传送:     https://www.luogu.org/problemnew/show/P1996

这里不讲数组模拟的方法(毕竟多做点题的模拟功力足以暴力出这道题),而是讲一种单循环链的做法。

读一下题就能发现题目中线性循环的思想,且题目数据范围不大,便考虑用单循环链模拟计数:

我们用数组来模拟这一链形结构:a[i]存放编号为i的节点的下一个节点的编号,(在本题中初始为a[1]=2,a[2]=3,...,a[n-1]=n,a[n]=1)这样每个节点都被上一个节点联系起来,所有节点就被“串成了一个循环链”,设j为指向当前报数节点的节点,当前报数节点即为a[j],当报数=m时,说明报数节点要离场,这是可让指着它的节点不再指它,而是指向它指向的节点,这样当前的报数节点就被整体的链给“驱逐”了。直到链的长度为0时,程序结束。

附AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 int a[101],n,m;
 5 int main()
 6 {
 7     cin>>n>>m;
 8     for(int i=1;i<n;i++)
 9         a[i]=i+1;
10     a[n]=1;
11     int j=n,p=0,k=1;//k为当前报数,p为离场(出圈)人数
12     while(p<n)
13     {
14         while(k<m)
15         {
16             j=a[j];
17             k++;
18         }
19         printf("%d ",a[j]);
20         a[j]=a[a[j]];
21         k=1;
22         p++;
23     }
24     return 0;
25 }

原文地址:https://www.cnblogs.com/InductiveSorting-QYF/p/10699821.html

时间: 2024-08-27 18:26:59

P1996 约瑟夫问题-题解(队列??明明是单循环链好吗)的相关文章

并发无锁队列学习(单生产者单消费者模型)

1.引言 本文介绍单生产者单消费者模型的队列.根据写入队列的内容是定长还是变长,分为单生产者单消费者定长队列和单生产者单消费者变长队列两种.单生产者单消费者模型的队列操作过程是不需要进行加锁的.生产者通过写索引控制入队操作,消费者通过读索引控制出队列操作.二者相互之间对索引是独享,不存在竞争关系.如下图所示: 2.单生产者单消费者定长队列 这种队列要求每次入队和出队的内容是定长的,即生产者写入队列和消费者读取队列的内容大小事相同的.linux内核中的kfifo就是这种队列,提供了读和写两个索引.

洛谷 P1996 约瑟夫问题

题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入输出格式 输入格式: n m 输出格式: 出圈的编号 输入输出样例 输入样例#1: 10 3 输出样例#1: 3 6 9 2 7 1 8 5 10 4 说明 你猜,你猜,你猜猜猜...... 猜不着吧,我也不告诉你!!! 屠龙宝刀点击就送 #include <cstdi

栈和队列----删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点 给定一个无序单链表的头节点head,删除其中值重复的节点 例如: 1->2->3->3->4->4->2->1->1->null 删除之后变为 1->2->3->4->null 方法1:如果链表长度为N,时间复杂度达到O(N) 方法2:如果要求空间复杂度为O(1),应该怎样实现 [解析] 方法1:利用哈希表去实现 使用哈希表,因为头节点是不用删除的节点,所以首先将头节点放入到哈希表中,然后从下一

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

一句话题解(持续更新中)

8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP 逆拓扑序(贪心常用手段防止现在过度影响未来)lim边界问题曾WA多次 bzoj 1012 树状数组(线段树)第二 暴力更新后缀第一(明显可卡) 暴力查询要TLE 单调栈没调出来 //bzoj 1010 toys玩具装箱 单调性 //bzoj 1006 弦图染色裸题 诱导子图.完全图.团.最小染色.最

C#队列

队列(Queue)是插入操作限定在表的尾部而其它操作限定在表的头部进行的线性表.把进行插入操作的表尾称为队尾(Rear),把进行其它操作的头部称为队头(Front).当对列中没有数据元素时称为空对列(Empty Queue).对列的操作是按照先进先出(First In First Out)或后进后出( Last In Last Out)的原则进行的,因此,队列又称为FIFO表或LILO表.队列Q的操作示意图如图所示. 队列的形式化定义为:队列(Queue)简记为 Q,是一个二元组, Q = (D

C#栈和队列

栈和队列是非常重要的两种数据结构,栈和队列也是线性结构,线性表.栈.队列这三种数据结构的数据元素以及数据元素之间的逻辑关系完全相同,差别是线性表的操作不受限制,而栈和队列的操作受到限制.栈的操作只能在表的一端进行,队列的插入操作在表的一端进行而其他操作在表的另外一端. 栈 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表.它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来).栈具有记忆作用,对栈

数据结构基础(14) --链式队列的设计与实现

链式队列是基于单链表的一种存储表示, 其形状如下图所示: (队列的队头指针指向单链表的第一个结点, 队尾指针指向单链表的最后一个结点, 注意没有无用的空[头/尾]节点) 用单链表表示的链式队列特别适合于数据元素变动比较大的情况, 而且不存在队列满而产生溢出的情况; 链式队列结点构造: [这次我们将节点构造成了类LinkQueue的嵌套类] struct ChainNode { ChainNode(const Type &_data, ChainNode *_next = NULL) :data(

最全C 语言常用算法详解-排序-队列-堆栈-链表-递归-树

具体 源代码 案例查看github,持续更新中............ github地址:https://github.com/Master-fd/C-Algorithm 1. 二分法查找 2. 冒泡排序 3. 插入排序 4. 希尔排序 5. 选择排序 6. 快速排序 7. 单链表实现堆栈 8. 单链表实现队列 9. 普通单链表 10. 递归实现斐波拉契数列 11. 递归实现strlen 12. 循环链表 13. 求素数 14. 双向链表 15. 顺序表实现队列 16. 顺序表实现栈 17. 顺