假设在超市里有一个排队等待自助结账的队伍,我正试着写一个函数来计算所有顾客结账所需的总时间!
输入:
customers:代表队列的正整数数组。2每个整数代表一个客户,其值是他们结账所需的时间。
n:正整数,收银台的数量。
输出:
函数应该返回一个整数,即所需的总时间。例如:
queue_time([5,3,4], 1)
# should return 12
# because when n=1, the total time is just the sum of the times
queue_time([10,2,3,3], 2)
# should return 10
# because here n=2 and the 2nd, 3rd, and 4th people in the
# queue finish before the 1st person has finished.
queue_time([2,3,10], 2)
# should return 12
只有一个队列服务于多个钱柜,队列的顺序永远不会改变。队列中的第一个人(数组/列表中的第一个元素)在钱柜空闲时立即进入钱柜。我试过这个,但它不能正常工作,我不知道如何在钱柜打开时让下一个人进入。
def queue_time(customers, n)
if customers == []
n=0
else
x= customers.reduce(:+) / n
if x < customers.max
customers.max
else
x
end
end
end
例如,测试
customers = [751, 304, 2, 629, 36, 674, 1]
n = 2
expected: 1461, instead got: 1198
谢谢:-)
5条答案
按热度按时间btxsgosb1#
给定输入:
您可以创建一个tils数组:(每个都是数组本身)
现在,对于每个客户,将其值添加到最短钱柜中:
最后,这将为您提供:
第一个总数是1461。
v7pvogib2#
您的问题福尔斯离散事件模拟的范畴(DES)建模。对于简单的模型,DES有时可以通过循环和条件来处理(如所提供的其他答案),但如果您计划扩展此模型或构建更复杂的模拟,您将需要使用Winter Simulation Conference tutorial中描述的某种事件调度框架。一个名为simplekit的gem提供了教程中概念的Ruby实现(完全公开-我是本文和gem的作者)。
一个简短的总结是,一个“事件”发生在一个离散的时间点,并更新系统状态。它也可以调度进一步的事件。DES框架维护一组挂起的事件作为优先级队列,以便事件以正确的顺序发生,而不管事件被调度和执行之间的时间延迟。所有这些都由框架提供的方法相对透明地处理。
下面是模型的一个实现,它使用了不同的参数化,并进行了大量注解:
其产生以下输出:
goqiplq23#
我可以通过在添加
puts
语句之后执行该方法来最容易地解释计算。一个二个一个一个
将显示以下内容。
ruoxqz4g4#
本质上与answer of Stefan相同,不同之处在于,这个答案只跟踪每个收银台的总和,而不是跟踪客户,并在每次新客户到来时重新求和。
f87krz0w5#
我真的很喜欢Stefan的答案,这个答案的工作原理也差不多,只是没有使用嵌套数组。
首先创建一个tils数组,每个tils的值为0。
然后,迭代customer数组,将每个customer项添加到具有最小值的till项,该项通过引用最小值的索引找到。
并隐式返回具有最大值的till项。
完整代码: