任务描述:难度为容易easy你是咖啡师。有很多咖啡师举办了一个竞赛,如果你能用一台咖啡机处理所有的订单,使顾客的所有等待时间的总和尽可能的小,他将给你大幅加薪。因此,你只有一台咖啡机,一次冲泡一杯咖啡。人们开始给你下订单。我们先不考虑你需要写下他们的订单的时间,但你需要额外的2分钟来在你做完每杯咖啡后清洁咖啡机。现在你有一个清单:订单的咖啡,你在每个订单旁边写下你需要冲泡每杯咖啡的时间。任务是给出你需要冲泡每杯咖啡的时间清单,打印出最短的总等待时间,如果你做对了,你将得到老板承诺的加薪。请注意,你一次只能冲泡一杯咖啡。因为你有一台咖啡机,所以你必须等它冲完当前的咖啡,然后才能继续冲下一杯。忽略你需要添加咖啡豆的时间和你等待接单的时间,写下你需要的每一个时间。例如:
因为咖啡冲泡时间不同,有三个顾客点了不同的咖啡,顺序分别冲泡所需要的时间为 [4,3,2] ,那么总共完成3位咖啡需要多少时间?第一位顾客要等4分钟喝咖啡,第二位顾客要等4分钟(第一位顾客拿咖啡的时间)再等2分钟(清洁机器的时间)再等3分钟(冲泡咖啡的时间)所以总共是:9 = 4 + 2 + 3分钟!第三位顾客按照同样的逻辑,即等待:9(前2位顾客)+2分钟(清洁)+2分钟(第3位的冲泡时间)= 13三位等待时间总计:4+(4+2+3)+(4+2+3+2+2) = 26 按照以上3位冲泡咖啡的顺序最终将导致总的等待时间为26分钟,但是请注意,这可能不是最短的时间。取决于你选择的冲泡咖啡杯的顺序,你冲泡咖啡的顺序完全由你决定。算法思路梳理:为了节省总的等待时间,尽量将耗时更短的排在前面。例如顺序调整后[2,3,4] 第一位:2 第二位:2+2+3第三位:(2+2+3)+(2+4) 以上三位的时间求和:22****注释:排序和递推的感觉!给出几个测试用例[4,3,2][20,5][2,10,5,3,9][5,4,3,2,1][20,5,4,3,1,5,7,8]
def barista(coffees):
prev,subtotal = 0,0
for t in sorted(coffees):
prev += t
subtotal += prev
prev += 2
return subtotal
[4,3,2]),22[20,5]),32
[2,10,5,3,9]),85
[5,4,3,2,1]),55
[20,5,4,3,1,5,7,8]),211**... ... **
二、递推解决物理中的电阻串并联问题
电阻X的值:1
电阻Y的值:2
串联级数:990
R= 1.414213562373095
电阻X的值:2
电阻Y的值:2
二叉树的层数:990
递推: R = 1.414213562373095
有趣的是,当串联的级数足够大,X电阻是1或2对等效电阻影响甚微!
def Parallel(x,y,layer):
a,b = x,y
for i in range(layer):
x,y = x*y/(x+y)+a,x*y/(x+y)+b
return (x*y)/(x+y)
x,y,layer = 1,1,10
print(Parallel(x,y,layer))
1.4132196466142735
三、继续新的挑战是观察下图,计算绿色部分的面积
def area(s,n): #n是缩小的倍数
areaSum = 0
for i in range(n):
areaSum += s * (1/3)**i
return areaSum
s,n = 1/3,10
print(area(s,n))
0.49999153245609573
参考以往文章找到更多启发