首页 > 其他 > 详细

约瑟夫环问题

时间:2016-05-28 20:26:37      阅读:190      评论:0      收藏:0      [点我收藏+]

题目描述:

   给n个人围城一个环,从m号开始杀,每次隔k-1个人(从上一次被杀的人下一个开始数k下,第k个人被杀),问最后剩下的人是几号。

   bc的75场有一个边形,uvalive3882 也是个变形;

思路:

   我们可以递推解决,设 f[n] 表示的是第 n 个被杀的人是谁。

   首先我们将人从0开始编号,然后就是0~n-1 。

   f[ 1 ] =0;

   第一次我们杀的是k-1号,然后我们重新编号,从原来的第k个开始编0号,

   然后如果我们知道剩余的n-1 的人剩余的是谁,那么原来这个人的编号就是加上k后的值;

   然后再反推一下。

   那么,我们知道,到最后,剩一个人的时候,他的编号肯定是0,而且必须死,所以有上面的f[1] = 0;

   那么他在上一次的编号是多少呢?

   如果k =3, 那么他的编号应该是 (0+3)%2 =1;

   我们来验证一下, 0 、1、 0 ,0死了,1剩下了。对的。

   所以。。。。就很简单了,递推一下就结束了,记得回头加上1;

   

/*************************************************************************
 > File Name: uvalive3882.cpp
 > Author: Baiyan
 > 题意:
 > Created Time: 2016年05月28日 星期六 17时08分47秒
 **********************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int f[10005];
int main()
{
    int n,m,k;
    while(scanf("%d%d%d", &n,&k,&m)!=EOF &&( n||k||m))
    {
        memset(f,0,sizeof(f));
        f[1]= 0;
        for(int i=2;i<=n;i++)
        {
            if(i<n)
                f[i] = (f[i-1]+k)%i;
            else
                f[i] = (f[i-1]+m)%i;
                        //这里就是当前杀第几个人就加几
        }
        printf("%d\n",f[n]+1);
    }
    return 0;
}
    

 

约瑟夫环问题

原文:http://www.cnblogs.com/by-1075324834/p/5538164.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!