1 条题解

  • 0
    @ 2025-7-13 18:31:40

    ✅ 解题策略

    我们从 m=1m = 1 开始逐一尝试,对于每一个 mm,模拟一个大小为 2k2k 的环,每次杀一个人,记录前 kk 个被杀的编号:

    只要其中有一个编号 k≤ k(也就是好人),那么这个 mm 不满足

    否则,说明前 kk 轮中杀死的都是坏人,可以输出这个最小的 mm

    代码实现

    #include <stdio.h>
    
    int main()
    {
        //freopen ("a.txt" , "r" , stdin ) ;
        int people[50] = {0}, k, Joseph[14] = {0};//Joseph用于打表,不然超时
        while(scanf("%d", &k) != EOF && k != 0)
        {
            if (Joseph[k] != 0)
            {
                printf("%d\n", Joseph[k]);
                continue;
            }
            int n = 2 * k;
            int m = 1;
            people[0] = 0;//people[0] = 0表示编号从0开始
            for (int i = 1; i <= k; i++)
            {
                //每次枚举完毕将剩下的人按从0到n - i编号,只要好人没有杀掉,则前面k - 1个编号是不变的
                people[i] = (people[i - 1] + m - 1) % (n - i + 1);
              //  printf ("[%d] = %d , " , i , people[i] ) ;
                if (people[i] < k)//第k个人的编号为k - 1,所以这里是<而不是<=
                {
                    i = 0 ;
                    m++;
                }
            }
           // printf ("\n") ;
            Joseph[k] = m;
            printf("%d\n", m);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    13
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者