试题 算法提高 最大乘积(python)

本文探讨了从一组整数中选取特定数量元素以获得最大乘积的问题,通过排序和双指针策略,有效解决了包含负数和正数的情况,确保了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:先对数组排好序,然后利用双指针进行处理,假如两个负数的乘积大于等于两个正数的乘积,那么取负数的乘积,因为后面可能还要用到正数的值;否则就取数值最大的数。详见代码。

题目:

资源限制
时间限制:1.0s   内存限制:512.0MB
问题描述
  对于n个数,从中取出m个数,如何取使得这m个数的乘积最大呢?
输入格式
  第一行一个数表示数据组数
  每组输入数据共2行:
  第1行给出总共的数字的个数n和要取的数的个数m,1<=n<=m<=15,
  第2行依次给出这n个数,其中每个数字的范围满足:a[i]的绝对值小于等于4。
输出格式
  每组数据输出1行,为最大的乘积。
样例输入
1
5 5
1 2 3 4 2
样例输出
48 

代码:

def fun(m,nums):
    nums.sort()  # 从小到大排序 有负数的话,负数在左边
    # 在m=1的情况下,直接返回最大值即可
    if m == 1:
        return nums[-1]
    s = 1
    start = 0 
    end = len(nums) - 1  
    while start < len(nums)-2 and end > 0 and m > 0:
        # 两个负数的乘积大于等于两个正数的乘积
        if nums[start] * nums[start+1] >= nums[end] * nums[end-1] and m >= 2:
            s *= nums[start] * nums[start+1]
            start += 2
            m -= 2
        # 否则取数值最大的数
        else:
            s *= nums[end]
            end -= 1
            m -= 1
    return s

if __name__ == "__main__":
    n = int(input()) # 数组的个数
    total = []
    while n > 0:
        a = list(map(int,input().split()))
        b = list(map(int,input().split()))
        total.append(fun(a[1],b))
        n -= 1
    for i in total:
        print(i)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值