约瑟夫环问题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; /** * 约瑟夫环问题 * 需 ...
随机推荐
- 磨刀——python及相关工具
1.python语言包 1.1去https://www.python.org/,在download栏下载最新版python2或者python3 tips:1.点击下载会很慢,推荐:迅雷,百度云盘下载, ...
- 第一次WM_PAINT事件执行前显示白色框 的解决办法
界面显示前,总是会显示白色或白加黑的窗体, 开始以为是图片加载慢的原因,后来发现这个框是在第一次WM_PAINT执行前显示的. 解决办法很简单,在CreateWindow的时候,加上WS_POPUP样 ...
- IPv6地址在URL上的格式
转自:http://www.cnpaf.net/Class/RFC/200408/983.html 摘要 本文档定义了在WWW浏览器的URL中执行的文本IPv6地址的格式.在包括Microsoft的I ...
- CF609E Minimum spanning tree for each edge
原来觉得是一个LCT,感觉自己瞬间傻掉…… 考虑到先做一个最小生成树求出做最小生成树的代价$ans$,顺便标记一下树边和非树边,把边按照输入$id$排序回去之后扫,如果扫到一条树边,那么此时的答案就是 ...
- jmeter MD5加密
MD5.jar已经上传到博客园的文件中 第一步 添加变量${Qpassword} 第二步 调用MD5加密 import hehe.Str2MD5;String res = new Str2MD5() ...
- 2015年第六届蓝桥杯省赛试题(JavaA组)
1.结果填空 (满分3分)2.结果填空 (满分5分)3.结果填空 (满分9分)4.代码填空 (满分11分)5.代码填空 (满分13分)6.结果填空 (满分17分)7.结果填空 (满分21分)8.程序设 ...
- Linux常用命令分类总结
文件及文件夹操作 新建文件 vi file 新建文件夹 mkdir dirName 复制文件 cp sourceFile targetFile 移动文件 mv file targetDir 文件或文件 ...
- WPARAM和LPARAM的含义
lParam 和 wParam 是宏定义,一般在消息函数中带这两个类型的参数,通常用来存储窗口消息的参数. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uM ...
- B - EXCEL排序(sort+结构体)
Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的 ...
- 【转】Linux将composer的bin目录放到PATH环境变量中
将composer的bin目录放到PATH环境变量中 使用composer global config bin-dir --absolute查看composer的bin目录 输出类似 Changed ...