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;
      }
    }

  • 相关阅读:
    [Oracle]Oracle的闪回归档
    【zabbix】snmp监控linux主机
    XFS文件系统
    PostgreSQL的使用向导
    PostgreSQL 12 YUM安装
    011.MySQL双主多从+Keepalived配置
    010.MySQL-Keepalived搭配脚本04
    009.MySQL-Keepalived搭配脚本03
    008.MySQL-Keepalived搭配脚本02
    007.MySQL-Keepalived搭配脚本01
  • 原文地址:https://www.cnblogs.com/hpuwangjunling/p/2404790.html
Copyright © 2011-2022 走看看