题意:

有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的更多相关文章

  1. C#实现约瑟夫环问题

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace orde ...

  2. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  3. C语言链表实现约瑟夫环问题

    需求表达:略 分析: 实现: #include<stdio.h> #include<stdlib.h> typedef struct node { int payload ; ...

  4. javascript中使用循环链表实现约瑟夫环问题

    1.问题 传说在公元1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的40 个同胞被罗马士兵包围.犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案.他们围成一个圈,从一个人开始,数到第 ...

  5. tc 147 2 PeopleCircle(再见约瑟夫环)

    SRM 147 2 600PeopleCircle Problem Statement There are numMales males and numFemales females arranged ...

  6. HDU 3089 (快速约瑟夫环)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3089 题目大意:一共n人.从1号开始,每k个人T掉.问最后的人.n超大. 解题思路: 除去超大的n之 ...

  7. 约瑟夫环(Josehpuse)的模拟

    约瑟夫环问题: 0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字. 这里给出以下几种解法, 1.用队列模拟 每次将前m-1个元 ...

  8. C++ 约瑟夫环问题

    约瑟夫环比较经典了 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直 ...

  9. 约瑟夫环的java解决

    总共3中解决方法,1.数学推导,2.使用ArrayList递归解决,3.使用首位相连的LinkedList解决 import java.util.ArrayList; /** * 约瑟夫环问题 * 需 ...

随机推荐

  1. 202. Happy Number 平方循环数

    [抄题]: Write an algorithm to determine if a number is "happy". A happy number is a number d ...

  2. js实现无刷新上传

    在新增数据项的时候,用ajax实现无刷新提交,但上传文件的时候,由于数据类型原因,不能将页面的<asp:FileUpload>中以字符串值的方式传到js里调用.我一共找到了两个方法予以解决 ...

  3. (数组)对数组中的数字加1(plus one)

    题目:https://www.nowcoder.com/practice/4d135ddb2e8649ddb59ee7ac079aa882?tpId=46&tqId=29111&tPa ...

  4. CodeForces 384E Propagating tree (线段树+dfs)

    题意:题意很简单么,给定n个点,m个询问的无向树(1为根),每个点的权值,有两种操作, 第一种:1 x v,表示把 x 结点加上v,然后把 x 的的子结点加上 -v,再把 x 的子结点的子结点加上 - ...

  5. 【IMOOC学习笔记】多种多样的App主界面Tab实现方法(二)

    Fragment实现Tab 首先把activity_main.xml 文件中的ViewPager标签改成Fragment标签 <FrameLayout android:id="@+id ...

  6. txt中把换行替换为空格

    把合适改为html后打开,换行都没了,然后复制到另一个txt即可

  7. sql server时间戳timestamp

    sql server时间戳timestamp 在SQL Server中联机丛书是这样说的: SQL Server timestamp 数据类型与时间和日期无关.SQL Server timestamp ...

  8. [C++11]shared_ptr循环引用导致内存泄露

    1 /* 2 * shared_ptr循环引用导致内存泄露 3 */ 4 5 struct A 6 { 7 shared_ptr<A> ptr; // 改为weak_ptr<A> ...

  9. models说明

    class UserType(models.Model): caption = models.CharField(max_length=32) class User(models.Model): na ...

  10. (字符转化)UTF-8和GBK有什么区别?

    GBK包含全部中文字符:UTF-8则包含全世界所有国家需要用到的字符. GBK编码:是指中国的中文字符,其它它包含了简体中文与繁体中文字符,另外还有一种字符“gb2312”,这种字符仅能存储简体中文字 ...