首页 > 其他分享 >约瑟夫环问题

约瑟夫环问题

时间:2023-10-16 14:47:36浏览次数:34  
标签:cnt int 约瑟夫 问题 队列 while cnt2 圈内

我今天要讲的问题是约瑟夫环问题。

本蒟蒻第一篇学术文章,多多支持,写的不好请见谅。

洛谷题库约瑟夫环问题

这题是一道好题目,我这里推荐两种解法

1.直接模拟

我用了一个数组来模拟,在圈内为无穷大,不在圈内则为0。

模拟时要注意以下几点:

  1. 如果当前已经出了圈,那么这个位置不算一人。

  2. 记得将数组的值变为0.

  3. 当计数器超过n时,需要重置为1。

于是我就写出来代码:

#include<bits/stdc++.h>
using namespace std;
int a[101];
int main(){
	int n,m,cnt=0,cnt2=1;
	cin>>n>>m;
	memset(a,0x3f,sizeof a);
	while(n){
		while(cnt2<=m){
			cnt++;
			cnt2++;
			if(cnt>n)cnt%=n;
			if(a[cnt]==0)cnt2--;
		}
		a[cnt]=0;
		cnt2=1;
		cout<<cnt<<' ';
		n--;
	}
	return 0;
}

结果发现不仅样例错了而且死循环。检查后发现是这个问题

判断计数器是否大于n时,因为n在减少,所以其实并未大于n就重置了。

改正后是这样的:

AC CODE

#include<bits/stdc++.h>
using namespace std;
int a[101];
int main(){
	int n,m,cnt=0,cnt2=1,nn;
	cin>>n>>m;
	nn=n;//备份n
	memset(a,0x3f,sizeof a);//将所有人标记为在圈内
	while(nn){
		while(cnt2<=m){//逐一计数
			cnt++;
			cnt2++;
			if(cnt>n)cnt%=n;//判断是否大于n
			if(a[cnt]==0)cnt2--;//判断此人在不在圈内
		}
		a[cnt]=0;
		cnt2=1;
		cout<<cnt<<' ';
		nn--;
	}
	return 0;
}

别急着走,接下来还有第二种方法:

2.巧用数据结构

在淘汰这种题目中,用数组并不是一个明智的选择,在标记是否在圈内时较为麻烦,而队列刚好解决了这个问题。

思路:

枚举m个人,前m-1个人先从队列另一头加入,再弹出,将第m个弹出队列,不需要考虑大于n和是否在圈内的情况。

AC CODE

#include <bits/stdc++.h>
using namespace std;
queue<int> q;
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		q.push(i);//预处理,将人放入队列
	}
	while(q.size()){
		for(int i=1;i<=m-1;i++){
			q.push(q.front());
			q.pop();
		}
		cout<<q.front()<<' ';
		q.pop();
	}
	return 0;
}

这是我的评测记录

(上面是模拟,下面是队列)

都看完了点个赞再走吧。

标签:cnt,int,约瑟夫,问题,队列,while,cnt2,圈内
From: https://www.cnblogs.com/xdh2012/p/17767271.html

相关文章

  • 关于留学读硕的常见问题汇总
     留服认证留服认证是指中国教育部留学服务中心+国(境)外学历学位认证,是目前国内官方权威认证途径,也是国内普遍接受的一个凭证。留信认证是一种新型的认证方式,接受度比留服认证稍低,虽然近年来不断被留学生和部分企业认可,但是对于想要进体制内的留学生,留信认证是无法被认可的。留服......
  • 解决matplotlib中文显示乱码问题
    问题findfont:Genericfamily'sans-serif'notfoundbecausenoneofthefollowingfamilieswerefound:SimHei解决方法importmatplotlibprint(matplotlib.matplotlib_fname())输出:xxx/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibrc下载htt......
  • 记录一些问题吧
    vue3+vite+eleplus  Componentname"layout"shouldalwaysbemulti-word.我都还么开始写就报这个几把错误,搞定 ......
  • 【分布式】解决树莓派4B-64位更换清华源问题(GPG error:because the public key is no
    【分布式】解决树莓派4B-64位更换清华源问题(GPGerror:becausethepublickeyisnotavailable)别出BUG求求了于2022-04-3016:15:38发布阅读量3.1k收藏18点赞数7分类专栏:分布式文章标签:debianbash树莓派清华源publickey版权分布式专栏收录该内容18篇文章1......
  • XTS测试问题分析
    CTS相关解决方式模块名备注恢复出厂CtsInputTestCases恢复出厂CtsSecurityTestCasesRemoteDPC相关IPV6相关CtsLibCoreTestCasesIPV6相关CtsNetTestCasesIPV6相关CtsAppSecurityHostTestCasesGTS相关开机导航处登google账号Setup......
  • 软件测试|selenium 元素无此属性NoSuchAttributeException问题分析与解决
    SeleniumNoSuchAttributeException异常原因及解析简介在使用Selenium进行Web自动化测试时,我们可能会遇到NoSuchAttributeException异常。这个异常通常在尝试访问一个元素的属性(attribute)时抛出,但该属性不存在。本文将介绍NoSuchAttributeException异常的常见原因以及解决方法,并附......
  • 如何解决使用代理IP后网速变慢的问题
    随着互联网的不断发展,越来越多的人开始使用代理IP来保护自己的隐私和安全。但是,有些人在使用代理IP后发现自己的网速变慢了。那么,如何解决使用代理IP后网速变慢的问题呢?下面我们将从以下几个方面进行详细的介绍。一、代理IP的原理代理IP是一种通过中间服务器来转发网络请求的技术。......
  • html2canvas 截图不全问题解决
    有个低代码平台项目,需求是要将canvas画布上的echarts图表等组件截图保存,如果是正常比例(也就是百分百比例)截图是正常的,但如果画布处于缩放状态进行截图的话就会因组件上的一些样式影响而导致截图不全。为了解决这一问题,在网上也查找了很多资料,终于找到解决办法,亲测有效。话不多说,......
  • [Ubuntu 20.04] 修复‘systemd-shutdown[1]: waiting for process: crond’需等待1分
    由于在2020-2021年期间下载过Linux版本的FreeDownloadManager(简称FDM,一款免费但不开源的跨平台下载工具),而该软件的官网被挂了木马,因此在此期间下载安装过FDM的Linux用户,其定时任务crond中都被挂上了木马。具体现象为,关机时需要等待1分30秒,系统显示‘systemd-shutdown[1]:waiti......
  • Graph Wave Net模型中的数据集hdf5和pkl文件的读取问题
    引入:GraphWaveNet的流量数据的文件格式是.h5,路网结构文件格式是.pkl,它们怎么打开呢?HDF5HDF5文件一般以.h5或者.hdf5作为后缀名,其中包含两种结构:Group(文件夹)和Datasets(数据)python可以使用h5py或pandas打开.h5文件h5pypath='metr-la.h5'f=h5py.File(path,'r')......