Poj1012_Joseph

POJ 1012 Joseph 题解 POJ 1012 Joseph 题解 题目解读: The Joseph’s problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, …, n, standing in circle every mth 阅读详情

一、Description

The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved.

Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy.
二、问题分析
        刚开始的时候没看懂英文,找了个翻译:约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。这道题感觉不容易,看了很多提示才有点感觉。
       开始的时候总想着用什么数据结构实现这个环,什么链表,栈之类的。又总是琢磨从0开始还是从1开始,傻逼逼地在那比对公式的输出结果数字。后来发现完全没有必要,因为好人与坏人总是分在两个K内的。好人在小的那一部分,坏人在较大的那部分。所以只要下个要杀的人>k就可以继续循环。这里比较坑爹的是,测试数据里面有相同的K,如果不用记忆化存储的话,可能会超时。所以,这里好多人就干脆打表了。
       什么是打表呢?如果第一个测试用例让你求第100个,那么你可以将前100个数据在自己电脑里算好再存起来,这样如果题目再问到小于100的情况,就我们就可以直接输出了,相当于查表输出,时间耗时就自然少的多了。如果第二个测试用例让我们求第200个,那么我们就从第101个算起,算出的结果继续存起来,以备下一次的实用,如此类推,这个存起来的过程就叫做打表。(打表法貌似被不少人鄙视)
      不用打表其实也是可以过的,前辈们总结了三点,再次小弟引用一下:
            1.要kill的人的位置公式p=(p+m-1)%rest+1
            2.kill的位置<k就break,此时剩下的人rest等于k就成功
            3.m不要递增,如6个人,m取1,2,3第一次就杀了好人了,没意义。m是k+1的整数倍或者k+1的整数倍加1,这样会提高不少。
import java.util.Scanner;

public class Poj1012_Joseph {

	public static void main(String[] args) {
		Scanner cin=new Scanner(System.in);
		int res[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//1~14,0位置不存放
		int k=0;
		while((k = cin.nextInt()) != 0){
			int m=0;
			if(res[k]==0){
				while(true){
					if(m/k==0)
					   m += k+1;
				    else 
				    	m ++;
					int rest=2 * k;
					int pos=0;
					while(true){
						pos=(pos+m-1)%rest+1; //位置公式
						if(pos>k){
							pos--;
							rest--;
						}else{             
							break;
						}
					}
					if(rest==k){ 
						res[k]=m;
						break;
					}
				}
			}
			System.out.println(res[k]);
		}
	}
}


    
     


POJ1012 Joseph 原题: Description The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is 阅读详情

相关推荐

POJ1012-Joseph问题:递推与表格法解决经典约瑟夫问题

约瑟夫问题(Josephus Problem),也被称为约瑟夫斯环,是一个著名的数学问题,其背景故事源自于历史上的一个传说:约瑟夫和一组人被罗马士兵围困,为了避免被杀死,他们同意以一个特定的顺序围成一个圈,然后从某一个人开始,沿着圈的顺序每数到第三个人就将其排除,如此循环直到剩下最后一个人。约瑟夫问题不仅是数学上的经典问题,也被广泛应用于计算机科学中,特别是在算法和数据结构的研究领域。

weixin_31974443的博客 1218

[poj1012]Joseph_Joseph

Joseph     题目大意:给你2*k个人,前k个是好人,后k个是坏人,编号从1到2*k。每次从上一个死掉的人的下一个开始查m个人并将第m个人杀死。问最后剩下的全是好人的m是多少。     注释:$1\le k \le 14$。       想法:开始觉得自己想的有些简单,然后发现其实就是这码事。dp。         dp状态:ans[i]表示第i个死的人        ...

dianan0938的博客 164

约瑟夫环改进问题,K个好人与K个坏人,好人出局之前坏人需全部出局

在原始的约瑟夫环的要求下增加一限制:一共有n个人组成环(n=2∗k),前k个是好人,后k个是坏人,即编号1~k是好人,k+1~2k是坏人。要求在第一个好人出局之前,所有的坏人都已经出局。

华为OJ 约瑟夫问题

功能: 约瑟夫问题众所周知,原始的约瑟夫问题是这样的:有n个人,编号为1,2,..., n,站成一圈,  每次第m个将会被处决,直到只剩下一个人。约瑟夫通过给出m来决定赦免其中的一个人。  例如当n=6,m=5时,5,4,6,2,3将会被依次处决,而1将会幸免。  假如有k个好人,和k个坏人,所有人站成一圈,前k个人是好人,后k个人是坏人,  编写程序计算一个最小的m,使k个坏人都被处

★匆匆★的专栏 2054

Ubuntu 24.04 极速部署 Dify:从零到一的保姆级实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Dify的完整教程,从环境准备到部署验证,再到深度优化和安全加固,提供了一套保姆级的实践指南。通过使用Docker和Docker Compose,结合国内镜像源加速,帮助用户高效完成Dify的安装和配置,确保系统稳定运行。

weixin_42662293的博客 244

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

POJ 1012 Joseph

问题描述:      假设有k个好人和k个坏人,围成圈坐着,前k个人是好人,后k个人是坏人。必须选定一个最小的m值,使得在第一个好人选出之前,所有的坏人全部死了。 输入描述:      输入包括若干行,每一行都是一个数,即k,0 输出描述:      每一行输出对应于k值的m值。  都说Joseph是一个经典,但是对于我这种以前没接触过的来说,哪算是经典啊。于是又去百度,找

flyRP的专栏 674

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

POJ 1012 Joseph题解与心得

POJ 1012 Joseph题解与心得   2010-06-06 13:15    这几天都在收集一些DP的资料,但读了一些入门的资料后我发现DP比我想象中的还要难入门,主要是DP问题各概念都比较抽象,想要一口把它的概念吃透有着不小难度,心急的朋友不要在这里踩进深坑了。经过几天思考,还没有摸到边缘的我打算先将DP放下,不然自己的信心越来越受打击了,为了不让自己对ACM的激情出现丝毫的减弱并且不陷进自卑的恶性循环当中,我决定选一些比较简单而且有趣的题目练练手,增加信心。   POJ 1012 Joseph问

leesofte的专栏 1187

Linux内核模块开发实战指南(2025版)

2025年Linux内核模块开发迎来革命性突破!本文将从零开始手把手教你构建可动态加载的AI加速驱动模块,揭秘最新内核特性与开发技巧,更包含独家性能调优方案与跨架构移植秘籍。文末附赠价值百万的调试脚本,助你轻松突破开发瓶颈!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1806

windows中搭建sonic云真机环境/云真机环境搭建-基于docker容器部署

基于Windows系统搭建Sonic远程云真机环境实现通过浏览器操作手机端系统

雾林小妖的博客 1015

poj1012-Joseph(输出出列编号模板)

poj1012-Joseph 分类: POJ解题报告2011-07-31 15:43 3748人阅读 评论(2) 收藏 举报 测试服务器   转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1303803255   大致题意: 有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为

林下的码路 974

3. 动手运行第一个 SAP Fiori Elements 应用(ListReport 类型)

这个代理服务器能够自动监听我们 Fiori Elements 应用里向 ES5 Demo 系统发送的 OData 请求,拦截这个请求,并通过 Node.js 代码向 ES5 服务器转发,拿到响应数据后再交还给 Fiori Elements 应用。后者对自己发出的请求被代理这件事情一无所知。本文的任务是,大家按照我的介绍,在本地成功运行笔者准备的这个 Fiori Elements 应用。的错误消息, 说明大家安装的 Node.js 版本没有达到本地运行 Fiori Elements 的最低要求。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1670

POJ1012 Joseph 约瑟夫环 水题

POJ1012 JosephDescription 有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为坏人(编号k+1~2k)。现在有一个报数m,从编号为1的人开始报数,报到m的人就要自动死去(下一个开始报数的为当前死去的下一个开始)。问当m为什么值时,可以使得在出现好人死亡之前,k个坏人先全部死掉?

Lxp的博客 1224

Debezium报错处理系列之第112篇:Cannot replicate because the master purged required binary logs. Replicate the

Debezium报错处理系列之第112篇:Cannot replicate because the master purged required binary logs.

zhengzaifeidelushang的博客 724

Android 13 内置xapk安装包的方法

安装xapk 内置xapk

安卓兼职framework和app工程师的博客 222

poj 1012 Joseph解题报告

<br />题目链接http://acm.pku.edu.cn/JudgeOnline/problem?id=1012<br />这题的大意就是2*k个人围成一个圆圈从1开始报数报到到m的杀死,要使得编号为k——2*k-1的k个坏人先被杀死,求满足题意的最小的m<br />其中0<K<15<br />最初的想法是模拟,完全模拟报号过程<br />#include <cstdio><br />bool flag[30];<br />int k,start,m,last;<br />int ans[15];<b

xiancaifu的专栏 847

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

POJ【1012】Joseph

题目链接:http://poj.org/problem?id=1012 分析 这道题是约瑟夫环的应用,利用公式 p=(p+m-1)%n 求出下一次出环的人的下标,需要注意的是,假设本次出环的人为x,则x之后的人的下标需要-1。从小到大枚举不同的报数值,当存在出环的k个人的下标都大于等于k时(下标从0开始),则该报数值就是答案。 假设n = 8,m = 30(n为人数,m为报数值) f(0)=0 f...

yj8023xx的博客 242

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【约瑟夫环】POJ 1012 Joseph

这段时间要沉迷刷题一段时间了,就让优快云陪我一起吧! 一、题目大意 题目就是一个典型的约瑟夫环问题,就是给你一个整数k(1<k<14),有2k个人围坐一圈,前k个人是好人,后k个人是坏人,要求这2k个人从1开始依次报数,每报到m,则该人被处死,然后从他后面那个人开始报1,再继续报数,要求一个最小的m,使得在坏人死完之前,没有好人死去。 二、题目思路以及AC代码 一开始以为就是一道...

Johnson的博客 419

【POJ】1012 Joseph

Description The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going

MrKnight的专栏 1763

POJ 1012 Joseph 解题报告

题目如下:JosephTime Limit: 1000MS  Memory Limit: 10000K Total Submissions: 28148  Accepted: 10512 DescriptionThe Josephs problem is notoriously known. For those who are not familiar with the original

彩凤飞翼 2141

POJ1012-Joseph

全解题报告索引目录 -> 【北大ACM – POJ试题分类】 转载请注明出处:http://exp-blog.com ------------------------------------------------------------------------- 大致题意: 有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为坏人(编号k+1~2k) 现在...

ζёСяêτ - 小優YoU 1万+
上一篇: Poj_1008--Maya Calendar
下一篇: Poj1298_The Hardest Problem Ever(水题)
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值