【py交易】算法竞赛入门经典6.3.1 小球下落 python

题目:
这里写图片描述

分析:
1.深度为D的开关二叉树共有2^D -1 个开关,从上到下,从做到右排序1,2,3,…,2^D-1
2.最开始,这课开关二叉树上的所有开关都是关闭状态,假设为off状态,当有一个小球经过以后,开关由off状态变为on状态
3.举个例子(不举),假设D=4,则共有15个开关,顺序如图上。
1)第一个小球下落的时候,首先经过开关1,因为开关1是off状态,所以小球往左走,开关1 的状态变为on
2)小球到达2,因为开关2的状态是off,所以小球往左走,开关2的状态变为on
3)小球到达4,因为开关4的状态是off,所以小球往左走,开关4的状态变为on
4)小球到达8,走不了了,则第一个小球的终点就是8号开关
5)第二个小球,首先经过开关1,因为开关1是on状态,所以小球往右走,开关1变为off,
。。。
n)第二个小球抵达12号开关
4.每个小球都要经过开关1,所以遍历的时候需要设一个临时的变量k,记录小球走的开关号
5.若是小球从一个off的开关m经过,则下一步就是王左走,即2m号开关,否则走向2m+1号开关
6.小球最大编号不能超过2^D-1,小球走到某个开关以后,会把开关需要翻倍(2m或者2m+1),所以小球最终所在的开关需要要除以2

code below:

# coding=utf-8
import math
D = 4
I = 2

n = int(round((math.pow(2,D))-1))#2^D-1

s = {}

def reverseRes(num):
    if num == 1:
        return 0
    elif num == 0:
        return 1

"初始化所有开关"

for index in range(1,n,1):
    s[index] = 0 #所有开关都关闭

for index in range(1,I+1,1):#遍历每个小球
    k = 1#需要一个辅助的编号,因为小球每次都是从第一个开关经过的
    while 1:
        s[k] = reverseRes(s[k]) #小球经过的开关改变
        if s[k] == 1:#小球经过以后,开关打开了,说明经过之前是闭合的,所以往左走
            k = 2*k
        else:
             k = 2*k+1
        if k > n:
            break
print k/2

更简便的方法:
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值