Python数据结构queue:热土豆问题和打印机模拟问题

本文介绍了如何使用Python数据结构中的队列解决热土豆问题和打印机模拟问题。在热土豆问题中,通过队列实现人们位置的变化,避免了额外的复杂度。而在打印机模拟问题中,探讨了同学们共享一台打印机时,不同打印速度和作业页数概率对等待时间的影响。
摘要由CSDN通过智能技术生成

应用一 热土豆问题描述

热土豆传递问题:假设有N个人,有一个热土豆在这N个人中传递,每经过一个人称为传递一次,假设传递m次,最后在哪个人的手中,该人就出去,然后自动落到下一个人手中。如此往复下去,求最后剩下的那个人(因为只有一个人了,所以不可能再传递下去)?

问题实现

利用队列实现热土豆问题:参加游戏的人名列表name_list,每一次传递土豆的次数num,返回最后剩下的人名即可.
这里换个角度思考一下,因为土豆是传递的,所以它的位置是不断变化的,而人的位置是固定的,但是如果去掉第m个人后,余下的人的位置就要改变,复杂度还有有开销的。 换个角度想一下,能不能土豆位置不变,人们一直在变化呢?因为人们位置在变动,所以去掉第m个人时就不用额外的变动了 。
这是引入队列,将土豆放在队首位置,人的位置变化m次后(队首的人弹出,在队尾入队,依次来达到循环队列的形式),此时在队首的人就会被去掉,接着继续往复循环变化。直到队列剩下一人。

from pythonds.basic.queue import Queue

def hotPotato(namelist, num):
    simqueue = Queue()
    for name in namelist:
        simqueue.enqueue(name)

    while simqueue.size() > 1:
        for i in range(num):
            simqueue.enqueue(simqueue.dequeue())    #一次传递

        simqueue.dequeue()
    return simqueue.dequeue()
print(hotPotato(["Bill",
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值