- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章HDOJ 1443 约瑟夫环的最新应用分析详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
k个男生和k个女生站成一列,前面k个是男生,后面k个是女生,从第一个男生开始报数,报到队列最后一个同学,循环到队首继续报,并且如果一个同学报到的数是m,这个同学就出列,然后后面的同学继续从1开始报数,现在求一个数m,使k个女生全部出列,而男生没有出列。 输入:男生女生的个数k(男生女生人数相等都为k,输出:m值 例: 输入:2,输出:7 输入:4,输出:30 本题是约瑟夫环变形 先引入Joseph递推公式,设有n个人(0,...,n-1),数m,则第i轮出局的人为f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0; f(i) 表示当前子序列中要退出的那个人(当前序列编号为0~(n-i)); 拿个例子说:K=4,M=30,
复制代码 代码如下
f(0)=0; f(1)=(f(0)+30-1)%8=5; 序列(0,1,2,3,4,5,6,7)中的5 f(2)=(f(1)+30-1)%7=6; 序列(0,1,2,3,4,6,7)中的7 f(3)=(f(2)+30-1)%6=5; 序列(0,1,2,3,4,6)中的6 f(4)=(f(3)+30-1)%5=4; 序列(0,1,2,3,4)中的4 ........ 。
依据题意,前K个退出的人必定是后K个人,所以只要前k轮中只要有一次f(i)<k则此m不符合题意。 注意: 本题有几点需要注意,否则很容易超时; 第一点、运用公式j=(j+m-1)%(n-i),推导出下一个出现的元素在第几号位置,如果j<k的话,不符合题意。 第二点、就是m,当只剩下k+1个数的时候,则上一个消失的数一定是在目前仅剩的bad左边或者是右边,所以m%(k+1)==0或者1 有了这两个条件,可以加快程序的速度。。。 完整的实现代码如下:
复制代码 代码如下
#include "stdio.h" #include "stdlib.h" int x[15]; /* 运用公式j=(j+m-1)%(len-i);推导出下一个出现的元素在第几号位置,如果j<k的话,不符合题意。 若有7个人,报到3的人依次出列 第一次 j=(j+m-1)%(len-i)=(0+3-1)%(7-0)=2 下标为2的3出列 新序列为 1 2 4 5 6 7 第二次 j=(j+m-1)%(len-i)=(2+3-1)%(7-1)=4 下标为4的6出列 新序列为 1 2 4 5 7 第三次 j=(j+m-1)%(len-i)=(4+3-1)%(7-2)=1 下标为1的2出列 新序列为 1 4 5 7 第四次 j=(j+m-1)%(len-i)=(1+3-1)%(7-3)=3 下标为3的7出列 新序列为 1 4 5 第五次 j=(j+m-1)%(len-i)=(3+3-1)%(7-4)=2 下标为2的5出列 新序列为 1 4 第六次 j=(j+m-1)%(len-i)=(2+3-1)%(7-5)=0 下标为0的1出列 新序列为 4 第七次 j=(j+m-1)%(len-i)=(0+3-1)%(7-6)=0 下标为0的4出列 新序列为空,至此,所有人已经全部出列,出列的顺序为:3 6 2 7 5 1 4 */ int test(int k,int m) { int i,j=0,len=k*2; for(i=0;i<k;i++) { j=(j+m-1)%(len-i); //约瑟夫环公式 if(j<k) return 0; //遇到前k轮中有小于k的直接返回0 } return 1; } /* 接下来说说m的取值范围:我们考察一下只剩下k+1个人时候情况,即坏人还有一个未被处决, 那么在这一轮中结束位置必定在最后一个坏人,那么开始位置在哪呢?这就需要找K+2个人的结束位置, 然而K+2个人的结束位置必定是第K+2个人或者第K+1个人,这样就出现两种顺序情况:GGGG.....GGGXB 或 GGGG......GGGBX (X表示有K+2个人的那一轮退出的人)所以有K+1个人的那一轮的开始位置有两种可能即最后一个位置或K+1的那个位置,限定m有两种可能: GGGG......GGGBX 若K+2个人的结束位置在最后一个(第K+2个),则m%(k+1)==0 GGGG......GGGXB 若K+2个人的结束位置在倒数第二个(第K+1个),则m%(k+1)==1 */ void Joseph(void) { int m,k; for(k=1;k<15;k++) { m=k+1; while(1) { if(test(k,m)) // m%(k+1)==0的情况 { x[k]=m; break; } if(test(k,m+1)) // m%(k+1)==1的情况 { x[k]=m+1; break; } m+=k+1; } } } int main(void) { int k; Joseph(); while(scanf("%d",&k),k) printf("%d\n",x[k]); system("pause"); } 。
最后此篇关于HDOJ 1443 约瑟夫环的最新应用分析详解的文章就讲到这里了,如果你想了解更多关于HDOJ 1443 约瑟夫环的最新应用分析详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
尝试从环的底部到顶部裁剪一个环 (50%),但结果并不像我预期的那样有效。 我的解决方案是 using bg_point_type = boost::geometry::model::d2::poin
上下文 我查看了 Google 上“Clojure、Ring、SSL”的前三个结果,对于使用 Clojure + Ring 设置 SSL 的“正确方法”似乎没有达成共识。 问题: 理想的答案是以下形式
这个问题在这里已经有了答案: 8年前关闭。 Possible Duplicate: Create random number within an annulus 我想在 annulus 内获得一个统一
对于我的应用程序,我需要组织一个循环(环形)队列。这意味着任何已处理的消息都会立即进入队列末尾继续处理。 例如: 队列:A、B、C。 接收方处理 A。 队列:B、C、A。 2 和 3 应以原子方式执行
我有一些源,其坐标(xn,yn,zn)相对于环的中心C和沿着我的视线的单位 vector (ns_ux,ns_uy,ns_uz)。我想计算这些源是否分别穿过内半径和外半径分别为 9.5 和 10.5
我想为 iOS 制作一个应用程序,我在 cocos2d 方面有一定的专业知识。我搜索了很多,但我发现的只是使用 webkit 实现此动画的 CSS,除了 C、Objective C、VHDL 之外,我
我有一个关于冷聚变和循环的问题。我有这个程序,我要求用户输入用户信息。用户可以为每种食物输入一些东西。 #GET_ITEM.ITEM_NBR#
安装后我遇到了 python key 环问题。这是我的步骤: $ python >>> import keyring >>> keyring.set_password('something','oth
我正在尝试从书中学习 MFC:MV C++ Windows Application by Example(2008)。有示例应用程序。我可以在其中绘制填充女巫所选颜色的戒指: void CRingVi
我正在寻求一些关于在 CSS 中创建“环形”形状的建议。以下是我需要实现的一些重要的详细目标: 环形边框粗细必须是百分比数字,而不是 rm 或绝对像素数,这样环形才能根据容器大小完全响应; 环形边框需
我真的很难掌握 Jade。我想做一些非常非常简单的事情:打印“一些文本”3次。我有一个 mixin 函数: mixin outputText() - for (var i = 0; i <= 3; i
如果用户已登录(即 session 的 user-id 键具有非零值),则路由到一个页面的最佳方法是什么;如果用户未登录,则路由到另一个页面的最佳方法是什么?理想的情况是有 2 组不同的路线。 谢谢!
我最近完成了一个程序,该程序将公钥下载到内存中,然后使用所有公钥创建一条加密消息。但是,我在创建仅包含我下载的 key 的列表时遇到了一些困难。首次下载时,它们存储在 gpgme_data_t 中。我
我需要在通过谷歌云运行的mysql中安装 key 环插件,但我不能,因为用户没有SUPER权限。有人遇到过同样的情况吗? mysql 安装插件 keyring_file SONAME 'keyrin
这是一个新手安全/控制台问题......我在我的项目中在欧洲的一个特定(错误)位置创建了一个 key 环。 我在控制台中看不到任何编辑甚至删除 key 环的方法。 key 圈完全是空的……里面没有 k
当我尝试从命令行(例如 svn)执行许多不同的操作时,我收到 gnome-keyring 警告。示例: $ lp README.txt WARNING: gnome-keyring:: couldn'
我的目标是使用 compojure 创建一个 Web 应用程序并附加 datomic 作为数据库。单独来看,这两个组件工作得很好。但是,当我尝试启动服务器时leinring server-headle
设置: 使用 GnuPG 的 Linux 或使用 GPG4Win(OpenPGP) 的 Windows 2048 RSA key 对已由可以访问 key 环的特权用户创建 已创建第二个较低权限的用户,
要创建加密表,可以使用以下查询: CREATE TABLE `t1` ( `intcol1` int(32) DEFAULT NULL, `intcol2` int(32) DEFAULT N
我对 Spring 框架很陌生。 我尝试迭代列表中的 10 个项目。我使用 thymeleaf 模板。 这是我的代码; 此代码无法正常工作,我找不到运行该代码的方法。 感谢您的关
我是一名优秀的程序员,十分优秀!