zoukankan      html  css  js  c++  java
  • Joseph

    Description

    The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved. 

    Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy. 

    Input

    The input file consists of separate lines containing k. The last line in the input file contains 0. You can suppose that 0 < k < 14.

    Output

    The output file will consist of separate lines containing m corresponding to k in the input file.

    Sample Input

    3
    4
    0
    

    Sample Output

    5
    30
    

    题意:约瑟夫环的变形。

    先说约翰夫环,即n个人围成一圈报数,报到数的人离开,问最后离开的那人的编号

    数学公式:

    s = 0;
    for(int i = 2; i <= n; i++){
         s = (s + m )%i;
    }
    printf("%d", s + 1);

    链表实现:

    输出的s就是最后的编号(根据n改变改变),即从零个数开始逆推上去原来的编号,不是推出的人,是编号的转变。

    本题是前n个好人后n个坏人,要算出的是坏人的编号,即推出的人的编号,所以是%len开始

    #include<cstdio>
    #include<cstring>
    using namespace std;
    bool check(int n,int m)
    {
        int len = 2*n;
        int s = 1;
        for(int i = 1; i <= n ; i++){
                 s = (s + m - 1)%len;
                 if(s == 0) s = len;
                 len--;
                 if(s <= n) return false;
                 if(s > len) s = 1;
        }
        return true;
    }
    int main(){
        int a[100];
        int n,m;
        for( n = 1; n < 14;n++){
                for( m = n+1;;m++){
                        if(check(n,m)){
                            a[n] = m;
                            break;
                        }
                }
        }
        while(~scanf("%d",&n)&&n){
                printf("%d
    ",a[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    MySQL数据库8(四)数据表基本操作
    MYSQL 配置文件
    MySQL数据库8(三)数据库基本操作
    flink-connector-kafka consumer的topic分区分配源码
    kafka consumer assign 和 subscribe模式差异分析
    kafka 配置kerberos校验以及开启acl实践
    二路归并排序的java实现
    storm RollingTopWords 实时top-N计算任务窗口设计
    PriorityBlockingQueue优先队列的二叉堆实现
    堆排序算法的java实现
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4314171.html
Copyright © 2011-2022 走看看