约瑟夫环

递推公式为:
ans[i]; //第i轮杀掉 对应当前轮的编号为ans[i]的人
ans[0]=0;
ans[i]=(ans[i-1]+m-1)%(n-i+1); (i>1 , 总人数n=2k 则n-i为第i轮剩余的人数)
ans[i]求得的是第i轮,编号从队首(并不是又开始数数,而是队首)为零计数出队的人的编号。
附上poj1012
代码
//Memory Time
//184K 250MS

include

using namespace std;

int main(void)
{
int Joseph[14]={0}; //打表,保存各个k值对应的m值

int k;  
while(cin>>k)  
{  
    if(!k)  
        break;  

    if(Joseph[k])  
    {  
        cout<<Joseph[k]<<endl;  
        continue;  
    }  

    int n=2*k;  //总人数  
    int ans[30]={0};  //第i轮杀掉 对应当前轮的编号为ans[i]的人  
                      //PS:每一轮都以报数为“1”的人开始重新编号  

    int m=1;    //所求的最少的报数  
    for(int i=1;i<=k;i++)  //轮数  
    {  
        ans[i]=(ans[i-1]+m-1)%(n-i+1);   //n-i为剩余的人数  
        if(ans[i]<k)  //把好人杀掉了,m值不是所求  
        {  
            i=0;  
            m++;  //枚举m值  
        }  
    }  
    Joseph[k]=m;  
    cout<<m<<endl;  
}  
return 0;  

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值