• 洛谷P1145 约瑟夫 数学


    洛谷P1145 约瑟夫   数学

    在做这题之前最好先做一下普通的约瑟夫问题  

    普通的约瑟夫问题  有一种递推的做法,比如说  12345 五个数,删掉3  之后,那你就把4编号改成3   5改成4,然后继续做就行了,但是后来这样求出的编号并不是其真实的编号,而是虚的编号

    然后这道题如果前k个一直没被删,那么被删除的编号一定是大于 k 的,

    这样做下去一直判断下去就行了,因为要mod 然后重新编号有些麻烦,所以还是坐标还是从0开始方便安全

     1 #include<cstdio>
     2 using namespace std;
     3 int i,find,k,m,begin;
     4 int check(int remain)
     5 {
     6     int result=(begin+m-1)%remain;
     7     if(result>=k){//判断出列的那个人
     8         begin=result;
     9         return 1;
    10     }
    11     else{return 0;}
    12 }
    13 int main(){
    14     scanf("%ld",&k);
    15     m=k;
    16     while(!find)
    17      {
    18         find=1;begin=0;//设置第一个
    19         for(i=0;i<k;i++)
    20         {
    21             if(!check(2*k-i))//如果判断好,就可以退出了……
    22             {
    23                 find=0;break;
    24             }
    25         }
    26         m++;
    27     }
    28     printf("%d",m-1);//多加了一个,减回去
    29     return 0;
    30 }
  • 相关阅读:
    python之连接oracle数据库
    从一副牌中随机抽一张牌
    判断一个点是否在圆内
    判断每个月有多少天
    猜数字游戏
    求一元二次方程的2个跟
    Servlet细节处理
    Servlet
    Http协议
    Struts2(2)
  • 原文地址:https://www.cnblogs.com/third2333/p/6954026.html
Copyright © 2020-2023  润新知