约瑟夫问题|的思路链接

约瑟夫问题|链接

顺着约瑟夫问题|的思路:

  • 循环的条件改变:不再是无脑取m个丢1个;每轮的筛选规则不一样,所以引入sum控制本轮循环次数j表示报数的周期
  • 第一轮筛选和后面的不同(被坑了):好好理解“接着第二轮再从上一轮最后一个报数的人开始”,第二轮开始,队列中的最后一个元素放到最前面,报数为1,一定不会被丢掉,所以本轮循环次数不再是队列长度,而是队列长度-1;而本来队列中的其他人报数变为其次序+1(队头元素从2开始报数)
class Joseph {
public:
    int getResult(int n) {
        queue<int>s;
        for(int i=1;i<=n;i++){//初始入队
            s.push(i);
        }
        int j=2;//报数周期
        int sum;
            while(s.size()>1){
                sum=s.size();//每轮报数次数,用于控制循环
                 int k;//区分第一轮和其他轮
                if(j==2)k=0;
                       else k=1;//其他轮:循环次数-1,报数=次序+1
                for(int i=1;i<=sum-k;i++){//(1)
                   if((i+k)%j==1){//(2)
                       s.push(s.front());
                       s.pop();
                   }
                    else {
                        s.pop();
                        if(s.size()==1){return s.front();}
                    }
                }
                j++;
            }
        return 1;//输入只有1人,返回1
        
    }
};