在高峰時間,實習生小飛常常會被電梯每層樓都停弄得很不耐煩,於是他想出了這樣一個辦法:由於樓層並不高,那麼在繁忙的時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層樓後,電梯聽下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓時,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層。
問:電梯停在哪一層樓,能夠保證這次乘坐電梯的所有乘客爬樓梯的層數之和最少?
#! /usr/bin/python# coding=utf-8import random,mathfrom itertools import groupbyfloor = 5def main(): arr = [random.randint(1,floor) for i in range(random.randint(3,5))] print arr do1(arr) do2(arr)def do1(arr): print "-" * 20 data = [(i,sum([abs(item - i) for item in arr])) for i in range(1,floor+1)] maxdata = min([item for index, item in data]) for index, item in data: print "%s,%s %s" % (index,item,"*" if item == maxdata else "")def do2(arr): print "-" * 20 arr = sorted(arr) nPerson = [0] * (floor + 1) for k,v in groupby(arr): nPerson[k] = len(list(v)) #print nPerson floors = sum([x - 1 for x in arr if x > 1]) n1,n2,n3 = 0, nPerson[1], sum(nPerson) - nPerson[1] nTargetFloor = format_print(1,n1,n2,n3,floors,None) for x in range(2,floor+1): floors += n1 + n2 - n3 n1 += n2 n2 = nPerson[x] n3 -= n2 nTargetFloor = format_print(x,n1,n2,n3,floors,nTargetFloor) def format_print(x,n1,n2,n3,floors, nTargetFloor): print x,n1,n2,n3,floors, if n1+n2 >= n3 and (nTargetFloor == None or nTargetFloor == floors): print "*" return floors print return nTargetFloorif __name__ == '__main__': main()