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;
}

  是不是很养老~反正这个数据范围的题是水得过去的。

猜你喜欢

转载自www.cnblogs.com/akura/p/10758080.html