Joseph问题

来源:互联网 发布:java thumbnails 编辑:程序博客网 时间:2024/05/16 06:29

题目描述:

原始的Joseph问题描述如下:有n个人围坐在一个圆桌周围,把这n个人依次编号为123……n。从编号是1的人开始数,数到第m个人出列,然后从出列的下一个人重新开始报数,数到第m个人时又出列,以此类推。当n=6m=5时,出列顺序依次是5,4,6,2,3,1

现在的问题是:假设有k个好人和k个坏人。好人的编号是1k,坏人的编号是k+12k。我们希望求出m的最小值,使得先出列的k个人都是坏人。

 

【输入】

4

 

【输出】

30

 

思考:要使得先出列的人都是坏人,m的值必定大于k,每报一次数,人数就要减1(重要),并且求一次mod。具体不好说,看看程序!

 

 

#include<cstdio>

 

long k,m,begin;

 

int check(long remain)
{
 long result=(begin+m)%remain;//当前人的下标,每循环一次,后面的人往前面补
 if(result>=k)
 {
  begin=result;return 1; //是坏人
 }
 else
  return 0;  //是好人
}

 

int main()
{
 long find=0;
 scanf("%ld",&k);
 m=k;
 while(!find)
 {
  find=1;begin=0;//从第一个人开始报数
  for(int i=0;i<k;++i)
   if(!check(k+k-i))//k+k-i为当前人数
   {
    find=0;break; //找到的是好人,继续寻找
   }
  ++m;
 }
 printf("%ld\n",m);
 return 0;
}


就是这么简单!
0 0