问题的高效解法_第1页
问题的高效解法_第2页
问题的高效解法_第3页
问题的高效解法_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这是一个非常经典的问题,是由古罗马著名史学家Josephus问题演变而来的,所以通常称为Josephus()问题。对于问题,通常的算法是用O(M*K)O(M2M、KO(M)的复杂度内解决本问题呢?答案n

1,3,5,7,…,

半,剩下 nnC,CK开始):KmodM,...,M-2,M-1,0,1,2,...,(K-2)modM。现在我们把它们的编号重编为0~M-2,变换后就完完全全成为了(M-1)只猴子报数的新问题,假去就能得到原问题的解!变回去的很简单,相信大家都可以推出来:X'=(X+K)modM(X'就是原问题的解);如何知道(M-1)只猴子报数问题的解呢?只要知道(M-2)只猴子的解就行了;(M-2)只猴子的解呢?当然是先求(M-3)的情 这F[I]=(F[I-1]+K)modI(I>1)。F[I],程序就变得非常简单:programjosephus2(input,output);vari,m,k,ans:longint;fori:=2tomdoans:=(ans+k)modi; O(M),相对于模拟算法已经有了很大的提高。可见,12345678911012345678911010111001197(也就是说,出圈前它是A7“1”的元素的下标8,则下一个出圈者在圈上的实际序号为(当前圈上序号+K-1)mod(7+5-1)mod8=3,31A[44。111110111101143211234567891011有了这个二维数组,我们要找第S“1”log2(M)S=3S<=A[4,1],表示要找的元素在当前队中,直接向下找(向S>A[2,1]表示要找的元素不在当前队中,那么肯定在右边队中,此时要将S减去A[2,1]变成1,然后到右侧队中直接向下找,此时“1programjosephus3(input,output);constmaxm=100000;vara:array[1..20,1..maxm]oflongint;forj:=1tomdov:=1;t:=(m+1)div2;{twhilet>1doA}

v:=v+1;vforj:=1totdoa[v,j]:=a[v-1,j*2-1]+a[v-1,j*2];t:=(t+1)div2forr:=mdownto1doout:=(out+k-1)modr;{计算下一个出圈者的序号}ifout=0thenout:=r;{序号为零其实就是最后一个}j:=1;temp:=out;fori:=vdownto1do

iftemp>a[i,j]thenbegintemp:=temp-a[i,jj:=j+1;end;ifi>1then

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论