2 条题解

  • 0
    @ 2025-10-8 16:51:47
    #include<bits/stdc++.h>
    using namespace std;
    int k, m;  
    bool bk; //判断是否合法 
    void dfs(int x, int s) // x为当前点,s为杀死的坏人个数 
    {
        if(s==k) return ;  //杀死了 k个坏人,结束 
        int n=2*k-s;   //当前存活人数 
        int y=(x+m-1)%n+1;  //下一个数到 m的人 
        if(y<=k) {bk=false; return ;}  // 下一个杀掉的人是好人,不合法 退出 
        dfs(y-1, s+1);   //从 y开始数的下一次,已杀死 s+1个人 
    }
    int main()
    {
          
        scanf("%d",&k);
        for(int i=k+1; ; i++)   //枚举 m 
        {
            if((i-1)%(2*k)+1>k)  //保证第一个数到 m的人是坏人 
            {
                bk=true; m=i;  //初始化 bk,记录 i 
                dfs(0,0);  //开始递归 
                if(bk) {printf("%d\n", m); break;}  //找到最小合法 m了, 输出 
            }
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:51:37



      #include<bits/stdc++.h>
      using namespace std;
      int k, m;  
      bool bk; //判断是否合法 
      void dfs(int x, int s) // x为当前点,s为杀死的坏人个数 
      {
          if(s==k) return ;  //杀死了 k个坏人,结束 
          int n=2*k-s;   //当前存活人数 
          int y=(x+m-1)%n+1;  //下一个数到 m的人 
          if(y<=k) {bk=False; return ;}  // 下一个杀掉的人是好人,不合法 退出 
          dfs(y-1, s+1);   //从 y开始数的下一次,已杀死 s+1个人 
      }
      int main()
      {
      
      scanf("%d"&#44;&amp;k);
      for(int i=k+1; ; i++)   //枚举 m 
      {
          if((i-1)%(2*k)+1&gt;k)  //保证第一个数到 m的人是坏人 
          {
              bk=1; m=i;  //初始化 bk,记录 i 
              dfs(0&#44;0);  //开始递归 
              if(bk) {printf("%d\n"&#44; m); break;}  //找到最小合法 m了, 输出 
          }
      }
      return 0;
      

      }

      </p>





      • 1

      【递归(难度:7)】好人&坏人的约瑟夫问题

      信息

      ID
      693
      时间
      1000ms
      内存
      128MiB
      难度
      5
      标签
      递交数
      21
      已通过
      13
      上传者