当前位置:首页>java>[编程]你这分得不对吧?

[编程]你这分得不对吧?

  • 2026-10-21 13:29:04
[编程]你这分得不对吧?
趣味题目的编程思考……
 背景问题
有3个海盗得到了一笔财宝,这批财宝正好有3n份。他们准备按照如下方式分配:
由汤姆(其中一个海盗)每次取出3堆,
--- 其中最值钱的一袋给头目
--- 汤姆拿第二值钱的一袋
--- 小弟拿最不值钱的一袋
那么,汤姆最多能拿到多少财宝?

例子
数据:正整数列表。其元素个数为3的倍数,元素表示每袋财宝的钱数。
如:piles = [2,4,1,2,7,8]
分两次分别取出(2,4,1)和(2,7,8),汤姆能拿到2+7=9。可以验证:这种取法,汤姆的财宝总数能够最大化。所以,返回9。
解决问题
我们考察取出的3堆:
--- 由于最值钱的袋子要给头目,则必定要拿出一个当前的最大值。
--- 由于汤姆要尽可能多拿,所以居中的值也要尽量大。
--- 由于给小弟的越多,则后续分配时汤姆必定会少拿,所以给小弟的要尽量少,取最小值。
结合来看,就是每次取当前列表的最大值、次大值和最小值。直到列表取完。
对于从小到大排好序的列表,前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

最新文章

随机文章