来自python数据结构和算法的mooc(北大)
Step1. 用python实现队列
class Queue(self):
def __init__ (self):
self.items = []
def enqueue(self,item):
self.items.insert(0,item)
def dequeue(self):
self.item.pop()
def size(self):
return len(self.items)
def isEmpty(self):
return self.items == []
热身运动——约瑟夫问题(热土豆问题)
一群人围成一圈,每逢有人读到7时,那人就要被杀死。(最后只有约瑟夫活下来…)
来,请编程,以得到要被杀人的名单。
from 有队列的文件 import Queue
def Hotpotato(namelist,num):
simqueque = 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(['键盘侠','杠精','人贩子','黄牛',\
'军火商','米国优益','辣鸡弹窗制造者'],7)))
#以上纯属娱乐不针对任何人
大头戏终于来辣
Step 2. 打印问题
实际配置:
一个实验室,在任意一小时之内,大约有10名学生在场,在这一小时中,每人会发起2次左右的打印,每次1~20页。
打印机性能:
草稿mode:10 pages/min
normal mode:5 pages/min(印得更好)
Question:
怎样在有限条件下,同学们都能顺利打印,并尽可能获得更好的打印效果
选择什么模式更好嘞?
下面请开始你的模(biao)拟(ni)~
以下为本菜鸟第一次大型血肉横飞现场(大神请右转)
from 有队列的文件 import Queue
import random
class Homework:
def release():
homework = random.randint(1,180)
if homework == 180:
gerhomework = Queue()
for i in range(1,random.randint(1,20))
gethomework.enqueue(i)
class Printer:
def __init__ (self,v):
gethomework = Homework()
def driftmode():
yep = totaltime
if gethomework > 0:
totaltime += 1
gethomework.dequeue()
else:
worktime = totaltime - yep
return worktime
def normalmode():
yep = totaltime
if gethomework >0:
totaltime += 1
gethomework.dequeue()
worktime = totaltime - yep
def idle():
pass
class Test():
def __init__ ():
totaltime = 0
def test_drift():
while totaltime < 3600 :
if not gethomework.isEmpty() and Printer.idle():
print("运行了" + Printer.driftmode())
else:
emm = True
else:
#写不下去了QAQ
老师解法:
打印机的定义
from 有队列的文件 import Queue
import random
class Printer:
def __init__ (self,ppm):
self.pagerate =ppm #打印速度
self.currenttask = None#打印任务
self.timeRemaining = 0#任务倒计时
def tick(self):#打印一秒
if self.currenttask != None
self.timeRemaining = self.timeRemaining -1
if self.timeremaining <= 0:
self.currenttask = None
def busy(self):#打印忙?
if self.currenttask != None:
return True
else:
return False
def startNext(self):#打印新作业
self.currenttask = newtask
self.timeRemaining = newtask.getPages()*60 / self.pagerate
生成作业
class Task:
def __init__(self,time):
self.timetamp = time#生成时间戳
self.pages = random.randrange(1,21)#打印页数
def getStamp(self):
return self.timestamp
def getPages(self):
return self.pages
def waitTime(self,currenttime):
return currenttime - self.timestamp#等待时间
def newPrintTask():
num = random.randrange(1,181)#1/180概率生成作业
if num == 180:
return True
else:
return False
开始模拟
def simulation(numSeconds,pagePerMinute):
labprinter = Printer(pagePerMinute)
printQueue = Queue()
waitingtimes = []
for currentSecond in range(numSeconds):
if newPrintTask():
task = Task(currentSecond)
printQueue.enqueue(task)
if (not labprinter.busy())and (not printQueue.isEmpty()):
nexttask = printqueue.dequeue()
waitingtimes.append(nexttask.waitTime(currentSecond))
labprinter.startNext(nexttask)
labprinter.tick()
#时间流逝
averageWait = sum(waitingtimes)/len(waitingtimes)
print("Average Wait %6.2f secs %3d tasks remaining."%(averageWait,printQueue.size()))
以上为模拟现实的妙用~