pku3517约瑟夫环问题

【题意】

典型约瑟夫环问题的变种,由杀人变成取石子,石子从1到n编号,先把m取掉(1<=m<=n),然后从m+1开始每k个石子取一个,问最后一个“胜利”的石子;

 

【分析】

这里m号石子先取掉,那么之后的循环不会再有m介入,所以我们只需要计算出剩下n-1个石子的最后胜者就可以。我们从m+1开始编号0,m+2编号1,。。。m-1编号n-2,用下面的Joseph()函数就可以计算出它们的最后胜者,返回结果要加1,因为编号从0开始,而我们题目数据计数从1开始,这样返回的结果是res, (res+m)%n就是答案了,开始wa了,因为如果res+m==n的话,应该输出n而不是0,改后AC,以后记住这个教训;

 

【代码】

 

/*3517 Accepted 356K 16MS G++ 468B 2011-01-20 09:07:53 */
#include<stdio.h>
int Joseph(int n,int m){//n个人,报数m;
    int i=2,a=0,b;
    if(n==1) return 1;
    while(i<=n){
        b= (a+m)%i; //i表示当前人数;
        a=b;
        i++;
    }
    return b+1;
}
int main()
{
    int n,m,k,res,i;
    while(scanf("%d%d%d",&n,&k,&m),(n+k+m)) 
    {
        res=Joseph(n-1,k);
        res= (m+res)%n;
        if(res==0) res=n;
        printf("%d/n",res);
    }
}           

阅读更多
个人分类: ACM_约瑟夫环问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

pku3517约瑟夫环问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭