约瑟夫环问题的几种解法
int mind01()
{vector<int> vec;int n, m;scanf("%d%d",&n,&m);//初始化for (int i=1;i<=n;i++){vec.push_back(i);}//开始游戏int vz = 0;while (vec.size() > 1) //留下最后一个人{//约瑟夫环经典公式-->循环队列vz = (vz + m - 1) % vec.size(); //因为下表从0开始的,所以减一//淘汰的那个人cout << vec[vz] << endl;vec.erase(vec.begin()+vz);}//淘汰掉最后一个人cout << vec[0] << endl;return 0;
}
int mind02()
{queue<int> que;int n, m;int count_num = 1; //计数scanf("%d%d",&n,&m);//初始化for (int i=1;i<=n;i++){que.push(i);}//开始游戏-->循环队列while (!que.empty()) //当队列不为空{if (count_num == m) //有人要被淘汰掉了{cout << que.front() <<" ";que.pop(); //把被淘汰的人从队列中剔除出去count_num = 1; //下一个人要重新从1开始}else //这个人不会被淘汰掉{count_num++;que.push(que.front()); //把队头的人当到队尾que.pop();}}return 0;
}
struct node
{int date;node *next;}*head , *tail; //循环链表的头尾结点void initList(int len)
{//辅助指针node* s;//建立头节点head = new node;tail = head;head->next = NULL;//初始化-->尾插法for (int i=1;i<=len;i++){s = new node;s->date = i;tail->next = s;tail = s;}tail->next = head->next; //循环链表
}void del_node(node * &cur,node * &pro)
{node *s = cur;pro->next = cur->next;cur = cur->next;delete s;s = NULL;
}int mind03()
{int n, m;int count_num = 1; //计数node *cur = NULL;node *pro = NULL;scanf("%d%d",&n,&m);initList(n);cur = head->next;cur = head->next;pro = head;这里我们不妨先把头节点删掉while (pro->next != pro) //只剩下最后一个人了{//cout << "aaaa" << endl;if (count_num == m) //踢人咯{count_num = 1;cout << cur->date << " ";del_node(cur,pro);}else{count_num++;cur = cur->next;pro = pro->next;}}//if (pro != NULL){//cout << "aaaa" << endl;cout << pro->date << endl;delete pro;pro = NULL;cur = NULL;}if (head != NULL)delete head;return 0;
}
//线段树-->可以直接百度查找模板直接使用即可 O(lbn)
/*
线段树是一种二叉搜索树,与区间树相似,
它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。
对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],
右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。
使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。
而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩。线段树至少支持下列操作:Insert(t,x):将包含在区间 int 的元素 x 插入到树t中;Delete(t,x):从线段树 t 中删除元素 x;Search(t,x):返回一个指向树 t 中元素 x 的指针。*/
约瑟夫环问题的几种解法相关推荐
- 约瑟夫环问题的两种解法(详解)
约瑟夫环问题的两种解法(详解) 题目: Josephus有过的故事:39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓.于是决定了自杀方式,41个人排成一个圆 ...
- 这样给面试官解释约瑟夫环问题的几种巧妙解法,面试官满意的笑了
转载请联系公众号:bigsai 前言 约瑟夫环问题是算法中相当经典的一个问题,其问题理解是相当容易的,并且问题描述有非常多的版本,并且约瑟夫环问题还有很多变形,这篇约瑟夫问题的讲解,一定可以带你理解通 ...
- —— 约瑟夫环(自杀环)的数学解法
首先简单介绍一下约瑟夫环: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围. 从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从 ...
- 约瑟夫环问题2(顺序表+链表求解)
1.背景知识 * 古代判官要判决number个罪犯的死刑,制定了一条荒谬的法律 * 将犯人站成一个圈,从start开始数起,每数到第distance * 个就处决他,依照此规律直到最后剩下一个人赦免. ...
- 数据结构学习-循环链表:处理约瑟夫环问题
目录 问题描述 一.基本概念 1.普通链表 2.单向循环链表 二.问题处理 1.创建链表 2.查找 3.删除 4.其他 三.实验环节 四.总结 问题描述 约瑟夫环问题的一种描述是:编号为1,2,... ...
- 约瑟夫环c语言单链表的解题思路,太透彻了:约瑟夫环的三种解法
[CSDN 编者按]极大概率出现在面试中的约瑟夫环问题来啦,本文三种方法描述解题思路,这样讲解绝对让面试官眼前一亮. 作者 | bigsai 责编 | 欧阳姝黎 前言 约瑟夫环问题是算法中相当经典的一 ...
- 映射递归循环-约瑟夫环问题递归解法的一点理解
先说明一点,如果有什么不对的地方,欢迎大家批评指正. 先来看这个类型的某个题目描述: 约瑟夫生者死者游戏 约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分.因此船长告诉乘 ...
- 约瑟夫环解法大全(C语言版)
前言: 约瑟夫环不愧是一道经典的算法题,原来也经常看到,但一直没有动手编码研究.最近又被同学提起这个问题,就研究了一下,发现这个问题可以挖掘的东西有很多,怪不得一直是面试的热门问题. 解法一,使用链表 ...
- 求约瑟夫环问题最后胜利者的一般解法以及数学推导方法
问题描述: 约瑟夫环问题(Josephus) 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 解法一: 思路:建立一个有N个元素的循环链表,然后从链表表头遍 ...
最新文章
- HDU 4467 分块
- 联想杜比音效_联想小新15 2020锐龙版开售
- python开发好学吗-Python是不是很难学?
- 自定义函数或者回调函数中调用对话框对象
- C#-获取磁盘,cpu,内存信息
- codevs 1004 四子连棋 BFS、hash判重
- java线程实例题_java线程相关试题实例源码代码
- mvcpager之学习
- REVERSE-PRACTICE-BUUCTF-24
- js 拉勾网效果_借助JShaman,建立自己的JS代码混淆平台
- 只有在配置文件或 Page 指令中将 enableSessionState”的异常解决办法
- 详解:物理地址,虚拟地址,内存管理,逻辑地址之间的关系
- php odbc驱动,php ODBC
- 如何查看或修改FANUC机器人的系统变量?
- AI 全自动玩斗地主,靠谱吗?Douzero算法教程
- 网页上的在线打印如何下载成本地PDF格式(人工亲测)
- 【软工】week3-个人阅读作业-软件案例分析
- OpenTCS 之 DefaultDispatcher 默认调度算法
- 微信支付提示:支付失败,如果已经扣款,资金会在0~3个工作日内原路退回
- python离线语音转文字