NOIP算法:约瑟夫问题(C++)

发布时间:2023-02-22 11:39:00   来源:文档文库   
字号:
约瑟夫问题也称为约瑟夫斯置换,在计算机编程的算法中,类似问题又称为约瑟夫环,又称“丢手绢问题”。一、一般形式1.N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6M=5,被杀掉的顺序是:5462312.有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。算法思路:模拟1)由于对于每个人只有在与不在环中两种状态2)开始时每个人都在环中3)模拟过程,直到环中只剩下一人。方法一:设立标记,每个元素标记为出队或在队中http://noi.openjudge.cn/ch0302/1748/#include#include#include#includeusingnamespacestd;constintmaxn=310;inta[maxn];intmain({intp,num,cnt,n,m,tmp;while(scanf("%d%d",&n,&m!=EOF&&(n!=0||m!=0{memset(a,0,sizeof(a;p=1;for(num=1;num<=n;num++{//一共要数nfor(cnt=1;cnt<=m;cnt++{//每一轮数到mwhile(a[p]==1p=p%n+1;//如果指针所指已有标记指针后移tmp=p;//此时p指向环中的第cnt只猴子p=p%n+1;//指针后移}a[tmp]=1;//将第m只猴子标记}printf("%d\n",tmp;//n轮的第m只猴子就是解}return0;}方法二:使用数组模拟链表codevs1282约瑟夫问题http://codevs.cn/problem/1282/#include#include#include#include#includeusingnamespacestd;constintmaxn=30050;inta[maxn];intmain({intn,m,i,j,p;scanf("%d%d",&n,&m;for(i=1;ifor(i=1;i<=n;i++{for(j=1;jprintf("%d",a[p];a[p]=a[a[p]];}return0;}
二、深入探讨对于约瑟夫问题,若需要依次记录退出编号的情况:优化方法是使用线段树维护区间和,并进行单点更新。具体方法见线段树章节。对于约瑟夫问题,若只需要求胜利者编号,而不需依次记录退出编号的情况:优化1把问题稍微改变一下,并不影响原意:问题描述:n个人(编号0~(n-1,从0开始报数,报到(m-1的退出,剩下的人继续从0开始报数。求胜利者的编号。则第一轮报数出队者的编号:(m%n-1+n%n第二轮报数由剩下的n-1个人组成了一个新的约瑟夫环,从k=m%n开始报数;其编号由第一轮的k,k+1...n,0,1,...k-2,变化为0,1.........n-1若第二轮出队编号为x,则其在第一轮中的编号应该为x=(x+k%n=(x+m%n推广到i-1个人报数若胜利者编号为x,则其在i个人的约瑟夫环中编号应该为x=(x+m%i故,令opt[i]表示i个人的约瑟夫环中报m个数的胜利者的编号,则有:opt[1]=0;opt[i]=(opt[i-1]+m%i(2<=i<=nopt[n]即为问题的解!考虑编号问题,若n个人从1开始编号,f[n]+1即为解。时间复杂度On);空间复杂度On);#include#include#include#includeusingnamespacestd;constintmaxn=310;intopt[maxn];intmain({intn,m,i;while(scanf("%d%d",&n,&m!=EOF&&(n!=0||m!=0{opt[1]=0;for(i=2;i<=n;i++opt[i]=(opt[i-1]+m%i;printf("%d\n",opt[n]+1;}return0;}优化2使用迭代算法使空间复杂度降为o(1;#include#include#include#includeusingnamespacestd;intf;intmain({intn,m,i;while(scanf("%d%d",&n,&m!=EOF&&(n!=0||m!=0{f=0;for(i=2;i<=n;i++f=(f+m%i;printf("%d\n",f+1;}return0;}优化3

本文来源:https://www.2haoxitong.net/k/doc/c86b134b7f21af45b307e87101f69e314332fa1e.html

《NOIP算法:约瑟夫问题(C++).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式