关闭

pku3517约瑟夫环问题

1010人阅读 评论(0) 收藏 举报

【题意】

典型约瑟夫环问题的变种,由杀人变成取石子,石子从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);
    }
}           

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:42470次
    • 积分:866
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:1篇
    • 译文:0篇
    • 评论:10条