zoukankan      html  css  js  c++  java
  • 约瑟夫环问题

    题目描述:

       给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
    ",f[n]+1);
        }
        return 0;
    }
        
  • 相关阅读:
    golang sql连接池的实现解析
    golang使用rabbitmq正确姿势
    golang使用rabbitmq多个消费者
    golang网关之手动实现反向代理
    golang exec.Command执行脚本 杀死子进程
    exec: "gcc": executable file not found in %PATH%
    golang操作mongodb
    grpc之 普通流 、服务端流、 客户端流 、双向流模式
    grpc-POST提交主订单数据(gateway实现http api)
    grpc之protobuf常用语法速学
  • 原文地址:https://www.cnblogs.com/by-1075324834/p/5538164.html
Copyright © 2011-2022 走看看