鱼C论坛

 找回密码
 立即注册
查看: 3710|回复: 9

[已解决]怎么将列表分成n对<新人求助>

[复制链接]
发表于 2021-4-17 12:48:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

给定长度为2n的自然数列表nums,把这些数分成n对,把每一对的最小值加起来(不同的分法,其和可能不同),输出最小值和的最大值。
【输入形式】

输入偶数长度的列表,包括方括号,逗号分隔
【输出形式】

和的最大值,整数
【样例输入】

[1,4,3,2]
【样例输出】

4
【样例说明】

把列表按照某种分法,分成n对,把每一对的最小值加起来。不同的分法,其和是不同的。

例如[1,4,3,2]可以分为:4,1和3,2  或者 4,2和3,1;或者4,3和2,1;显然4,3和2,1这种分法最小值的和最大,3+1=4,前面两种最小值都是3。所以输出结果4.


def maxsum(nums):
        n=int(len(nums)/2)
        list_d3=[]
        for i in range(n+1):
                list_part1=nums[i:i+n]
                d1=min(list_part1)
                nums_copy=nums[:]
                del nums_copy[i:i+n]
                list_part2=nums_copy
                d2=min(list_part2)
                d3=d1+d2
                list_d3.append(d3)
                list_d3=list_d3[:]
        d4=max(list_d3)
        return d4
nums  =  eval(input())
v  =  maxsum(nums)
print(v)
我只能将列表分成两对,新人求助
最佳答案
2021-4-17 13:16:15
def fenge(nums):
    return list(zip(*[iter(sorted(nums))]*2))

def maxsum(fenge_nums):
    return sum(map(lambda x:x[0],fenge_nums))

nums=[1,7,3,4,5,11]
fenge_nums=fenge(nums)
print(fenge_nums)
print(maxsum(fenge_nums))
先拆分再求结果可以这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-17 13:08:04 | 显示全部楼层
def maxsum(x):
    x.sort()
    print('最大和分组是:[%d,%d]' % (x[-1],x[-2]))
    print('最大和结果是:%d' % (x[-1]+x[-2]))
    print('最小和分组是:[%d,%d]' % (x[0],x[1]))
    print('最小和结果是:%d' % (x[0]+x[1]))

maxsum(eval(input('请输入整数列表:')))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 13:14:25 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-4-17 13:16 编辑
def MaxMinimumSum(nums: list) -> int:
    result = 0
    nums.sort()
    for i in range(0, len(nums), 2):
        result += nums[i]
    return result

if __name__ == '__main__':
    nums = [1, 4, 3, 2]
    print(MaxMinimumSum(nums))

抽象看问题,题目虽然是拆分列表,但是要求输出是 最小值和的最大值,这才是目标
所以不是一定要先拆分再求结果
2n大小的数组  分成n对  -->  就是每对2个数
最小值和的最大值   -->  必然是小的数和小的数分一对,就直接对数组排序,然后每2个数分一对  求和
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2021-4-17 13:16:15 | 显示全部楼层    本楼为最佳答案   
def fenge(nums):
    return list(zip(*[iter(sorted(nums))]*2))

def maxsum(fenge_nums):
    return sum(map(lambda x:x[0],fenge_nums))

nums=[1,7,3,4,5,11]
fenge_nums=fenge(nums)
print(fenge_nums)
print(maxsum(fenge_nums))
先拆分再求结果可以这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-17 13:34:10 From FishC Mobile | 显示全部楼层
笨鸟学飞 发表于 2021-4-17 13:08

长度为2n   要不是4个数呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 18:46:20 | 显示全部楼层
换个思路理解这个题目
我感觉无论你怎么分。既然是自然数列表,只要按照升序排列,索引位置前两位的和必然是最小值,索引位置最后两位相加一定是最大值。

直接index(0)+index(1)的值就应该是min
index(len(2n))+index(len(2n-1))的值就应该是max
不信你可以试试例举几个
如:[1,2,3,4][1,2,3,4,5,6]等等
最后也不知道这种题目的设置是啥意义!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-4-17 18:50:21 | 显示全部楼层
wp231957 发表于 2021-4-17 13:34
长度为2n   要不是4个数呢

2n必然是偶数了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 18:53:24 | 显示全部楼层
yuxijian2020 发表于 2021-4-17 13:14
抽象看问题,题目虽然是拆分列表,但是要求输出是 最小值和的最大值,这才是目标
所以不是一定要先拆 ...

所以完全不能理解这个出题意义在哪里哎!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-18 17:45:44 | 显示全部楼层
lovecnbear 发表于 2021-4-17 18:46
换个思路理解这个题目
我感觉无论你怎么分。既然是自然数列表,只要按照升序排列,索引位置前两位的和必然 ...

[1,2,3,4,5,6] max是1+3+5 只和奇数位有关 不是前两位最后两位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-19 23:27:42 | 显示全部楼层
wp231957 发表于 2021-4-17 13:34
长度为2n   要不是4个数呢

冒泡排序之后。0和1是最小,最后和倒数第2是最大,有异议?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 01:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表