zoukankan      html  css  js  c++  java
  • 小猴子下落

     

    小猴子下落

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述

    有一颗二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从左到右从上到下的编号为1,2,3,·····,2的D次方减1。在结点1处放一个小猴子,它会往下跑。每个内结点上都有一个开关,初始全部关闭,当每次有小猴子跑到一个开关上时,它的状态都会改变,当到达一个内结点时,如果开关关闭,小猴子往左走,否则往右走,直到走到叶子结点。

    一些小猴子从结点1处开始往下跑,最后一个小猴儿会跑到哪里呢?

     
    输入
    输入二叉树叶子的深度D,和小猴子数目I,假设I不超过整棵树的叶子个数,D<=20.最终以 0 0 结尾
    输出
    输出第I个小猴子所在的叶子编号。
    样例输入
    4 2
    3 4
    0 0
    样例输出
    12
    7
    
    很容易理解的方法:

    #include<iostream>
    #include<cstring>
    using namespace std;

    int s[1<<20];

    int main()
    {
      int d,n,k,max,i;
     
      while(cin>>d>>n)
      {
        if(d==0&&n==0)
      break;
        memset(s,0,sizeof(s));
     for(i=0; i<n; i++)
     {
        k=1;
        max=(1<<d)-1;
       for( ; ; )
       {
          if(!s[k])
       {  s[k]=1; k=k*2;}
       else { s[k]=0; k=k*2+1;}
       if(k>max) break;
       }
     }
     cout<<k/2<<endl;
      }
      return 0;
    }

    在以上方法之上琢磨出的方法

    #include<iostream>
    using namespace std;
     
    int main()
    {  
      int d,i,k;
       
      while(cin>>d>>i && (d+i) !=0)
      
      {    
        k=1;      
        for (int j=0;j<d-1;j++)         
        if(i%2) {k=k*2;i=(i+1)/2;}         
        else {k=k*2+1;i/=2;}    
     
     cout<<k<<endl;
      }
    }

  • 相关阅读:
    Yii2 分页
    Yii2 或者当前登录用户帐号
    css3媒体查询判断移动设备横竖屏
    Javascript操作Tr隐藏显示变形~
    php注释标准
    匹配一段html中所有的src
    数据库遇到错误(随时补充)
    NetCore-缓存文件上传和文件流上传
    SVN跨服务器版本迁移
    发票同步微信卡包
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2404790.html
Copyright © 2011-2022 走看看