初学队列Queue实例——打印问题(Python数据结构和算法)

来自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()))
			

以上为模拟现实的妙用~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值