约瑟夫环问题poj1012
题意:
有k个坏人k个好人坐成一圈,前k个为好人(编号1~k),后k个为坏人(编号k+1~2k)
现在有一个报数m,从编号为1的人开始报数,报到m的人就要自动死去。
问当m为什么值时,可以使得在出现好人死亡之前,k个坏人先全部死掉?
已知:k,n=2*k
求:m
分析:例子 k=3,n=6,m=5
1 2 3 4 5 6
以m=5为一循环长度报到m的编号依次为:5,4,6,2,3,1
就是长为n的数组以m为循环长度进行循环,输出报到m的编号
1 2 3 4 5 6 (黑体为报开始循环1的编号)
1 2 3 4 6
1 2 3 6
1 2 3
1 3
1
符合以下规律公式:ans[i]=(ans[i-1]+m-1)%(n-i+1)+1; //ans[0]=0
注明:ans[i]中的i是指第i次报到m,其值ans[i]是指第i次报到m的编号
该规律公式法代码:
- #include<iostream>
- using namespace std;
- int main()
- {
- int k;
- int jos[]={};
- while(cin>>k&&k!=)
- {
- if(jos[k]!=)
- cout<<jos[k]<<endl;
- else
- {
- int n=*k;
- int m=k+;//如果m<=k,那么第一次杀的一定是好人
- int ans[];
- ans[]=;
- for(int i=;i<=k;i++)//循环需要杀坏人的次数
- {
- ans[i]=(ans[i-]+m-)%(n-i+);
- if(ans[i]<k)
- {
- i=,m++;
- }
- }
- jos[k]=m;
- cout<<jos[k]<<endl;
- }
- }
- }
另一种方法:
- #include<iostream>
- using namespace std;
- bool result(int k,int m) //检测m是否符合
- {
- int mod=;
- int n=*k;
- for(int i=;i<k;i++)
- {
- mod=(mod+m-)%(n-i);//n-i是圈子余下的人数,以这个为实际圈子长度
- //m是循环长度 m-1是因为都是从0开始的 mod是上一个数的位置
- if(mod<k)
- return false;
- }
- return true;
- }
- int main()
- {
- int k;
- int data[]={};
- while(cin>>k&&k!=)
- {
- if(data[k]!=)
- cout<<data[k]<<endl;
- else
- {
- int m=k+;
- while(result(k,m)==)
- {
- m++;
- }
- data[k]=m;
- cout<<m<<endl;
- }
- }
- return ;
- }
约瑟夫环问题poj1012的更多相关文章
- C#实现约瑟夫环问题
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...
- C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析
尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...
- C语言链表实现约瑟夫环问题
需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...
- javascript中使用循环链表实现约瑟夫环问题
1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...
- tc 147 2 PeopleCircle(再见约瑟夫环)
SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...
- HDU 3089 (快速约瑟夫环)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...
- 约瑟夫环(Josehpuse)的模拟
约瑟夫环问题: 0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 这里给出以下几种解法, 1.用队列模拟 每次将前m-1个元 ...
- C++ 约瑟夫环问题
约瑟夫环比较经典了 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直 ...
- 约瑟夫环的java解决
总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...
随机推荐
- 基于IFC的大型三维城市群体——智慧城市模拟
- jetty启动常用命令
1. 启动Jetty Server:运行命令:Java -jar start.jar 指定项目名称启动: java -jar start.jar -Dname=zoush 保持jetty后台 ...
- Elasticsearch - glossary
From http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/glossary.html glossary of ...
- JavaPersistenceWithHibernate第二版笔记-第六章-Mapping inheritance-005Table per subclass with joins(@Inheritance(strategy = InheritanceType.JOINED)、@PrimaryKeyJoinColumn、)
一.结构 The fourth option is to represent inheritance relationships as SQL foreign key associations. Ev ...
- SPOJ GSS7 - Can you answer these queries VII
板的不能再板,链剖+线段树或者是LCT随便维护. 感觉唯一要注意的是跳链的时候要对$x$向上跳和$y$向上跳的情况分开讨论,而不能直接$swap$,因为只有两段接触的端点才能相互合并,而且每一次向上跳 ...
- Luogu 3402 可持久化并查集
点开这题纯属无聊……不过既然写掉了,那就丢一个模板好了 不得不说,可持久化并查集实现真的很暴力,就是把并查集的数组弄一个主席树可持久化. 有一点要注意的是不能写路径压缩,这样跳版本的时候会错,所以弄一 ...
- js的学习
对于 ff的 relatedTarget 及IE的toElement fromElement DOM通过event对象的relatedTarget属性提供了相关元素的信息.这个属性只对于mou ...
- 没事写写css
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...
- Entity Framework Code-First(22):Code-based Migration
Code-based Migration: Code-based migration is useful when you want more control on the migration, i. ...
- boost::python开发环境搭建
本来想用mingw编译boost::python模块,网上看了下资料太少,只有使用vs2012 操作环境:win7 x64 python: x86 boost: 1.57 编译boost::pytho ...