有3个海盗得到了一笔财宝,这批财宝正好有3n份。他们准备按照如下方式分配:
数据:正整数列表。其元素个数为3的倍数,元素表示每袋财宝的钱数。分两次分别取出(2,4,1)和(2,7,8),汤姆能拿到2+7=9。可以验证:这种取法,汤姆的财宝总数能够最大化。所以,返回9。--- 由于最值钱的袋子要给头目,则必定要拿出一个当前的最大值。--- 由于汤姆要尽可能多拿,所以居中的值也要尽量大。--- 由于给小弟的越多,则后续分配时汤姆必定会少拿,所以给小弟的要尽量少,取最小值。结合来看,就是每次取当前列表的最大值、次大值和最小值。直到列表取完。对于从小到大排好序的列表,前n个是固定要给小弟的。后2n个,每两个取较小值便是汤姆能取得的结果。def maxCoins(piles: list[int]) -> int: piles.sort() #从小到大排序 n = len(piles)//3 #计算每个人的份数 return sum(piles[n::2]) #从下标n开始隔1个取1个
maxCoins(piles = [2,4,1,2,7,8])# --> 9