OI养老专题01:约瑟夫问题
Posted akura
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OI养老专题01:约瑟夫问题相关的知识,希望对你有一定的参考价值。
有M个人,其编号分别为1-M。这M个人按顺序排成一个圈。现在给定一个数N,从第一个人开始依次报数,数到N的人出列,然后又从下一个人开始又从1开始依次报数,数到N的人又出列...如此循环,直到最后一个人出列为止。
输入只有一行,包括2个整数M(8 <= M <= 15 ),N( 5 <= N <= 32767 )。之间用一个空格分开。
输出M行,每行一个整数,表示每次出列的人的编号。
好养老的一道经典题啊......为什么不回忆一下刚学OI时的愚钝,暴力模拟一下呢?反正刚学OI时也是这么做的......
一开始想用指针,但是发现敲不来(菜);然后改用邻接表,发现也敲不来......反正这么菜,干脆打vis数组好了,遇到vis[i]=1就跳过:
for(int i=1,cnt=1,res=m;res>=1;i=i%n+1) if(!vis[i]){ if(!cnt) printf("%d\n",i),vis[i]=true,res--; cnt=(cnt+1)%n; }
是不是很养老~反正这个数据范围的题是水得过去的。
以上是关于OI养老专题01:约瑟夫问题的主要内容,如果未能解决你的问题,请参考以下文章