zoukankan      html  css  js  c++  java
  • UVa 679 小球下落 简单模拟题,树

    题目大意:给你一个完全二叉树,并且给他们编号,编号规则为左子树为2*k,右子树为2*k+1,每一个节点

    上都有一个开关,初始时开关都处于关闭状态,小球碰到节点就会改变该点的开关的状态。然后给你I个小球,

    要求输出第I个小球最终到达的叶子节点的编号。

    思路分析:简单的模拟题,主要是要对二叉树的结构和编号原则清楚,有D层,则一共有(1<<D)-1个节点,然

    后就可以开一个数组用来储存每一节点的状态,初识化为0,表示均处于关闭状态,然后就开始进行模拟,判断是否

    越界通k>n?注意最后 要输出k/2;

    代码:

    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int maxn=20;
    bool s[1<<maxn];//储存开关状态
    int main()
    {
        int D,I;
        while(~scanf("%d%d",&D,&I))
        {
            memset(s,0,sizeof(s));//初始化开关状态
            int k,n=(1<<D)-1;
            for(int i=1;i<=I;i++)//小球个数
            {
                k=1;
                while(1)
                {
                   s[k]=!s[k];
                   k=s[k]?2*k:2*k+1;//一定要先变状态
                   if(k>n) break;
                }
            }
            cout<<k/2<<endl;//注意是k/2;
        }
        return 0;
    }

    读了紫书以后的优化代码,只需要判断球是第几个到该节点的,就可以知道它下一步往哪里滚。

    这样做大大提高了代码效率。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <stack>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    //const int maxn=20;
    //bool s[1<<maxn];//储存开关状态
    int main()
    {
        int D,I;
        while(~scanf("%d%d",&D,&I))
        {
            int k=1;
            for(int i=1;i<=D-1;i++)//共需要判断D-1次
            {
               if(I%2){k=2*k;I=(I+1)/2;}
               else
               {
                  k=2*k+1;
                  I/=2;
               }
            }
            cout<<k<<endl;
        }
        return 0;
    }

  • 相关阅读:
    jdk和jre有什么区别?
    Apache的作用及意义
    博客园新成员的第一天
    重构改善既有代码的设计--简化条件表达式
    SourceMonitor: 代码重构的小工具,大用场
    使用Eclipse中提供的Refactor(重构)工具
    极大提高Web开发效率的8个工具和建议(含教程)
    Hbase shell命令
    Java多线程-新特性-有返回值的线程
    Java多线程-新特征-条件变量
  • 原文地址:https://www.cnblogs.com/xuejianye/p/5462340.html
Copyright © 2011-2022 走看看