python蓝桥杯算法 最大乘积

这里是引用
问题描述
  对于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

笔者这里先判断了选择数字的情况,负数的个数以及最后零的个数,
函数 def chuli():中 变量 i 和 length可以理解为指针 指向代表是当前位置,是否要选择这个数


def chuli(num_list,count):
    i = 0
    length = len(num_list)
    num = 1
    while count != 0:
        if num_list[i] == 0:
            i += 1
        if num_list[i]*num_list[i+1] >= num_list[length-2]*num_list[length-1]:
            num *= num_list[i]
            count -= 1
            i += 1
        elif count >= 2:
            num *= num_list[length-1]*num_list[length-2]
            length -= 2
            count -= 2    #取负数的情况正数指针不加一
        else:
            num *= num_list[i]
            count -= 1
            i += 1

    return num
group_nums = int(input())
res = []
for i in range(group_nums):
    num = 1
    count = 0
    guiding = list(map(int,input().split())) #数字几个取出几个
    num_list = list(map(int,input().split()))[:guiding[0]]
    num_list.sort(reverse=True)
    # final_list  = []
    # zero = 0
    # for x in num_list:
    #     if x != 0 :
    #         final_list.append(x)
    #     elif x < 0:
    #         count += 1
    #     else:
    #         zero += 1
    # final_list.sort(reverse= True)
    if guiding[1] == 1: #只选一个
        res.append(num_list[0])
    # elif zero >= guiding[0] - guiding[1]:
    #     res.append()
    else:
        if count == 1: #一个负数
            for x in range(guiding[1]):
                num*= num_list[x]
            res.append(num)
        else:
            res.append(chuli(num_list,guiding[1]))
for i in res:
    print(i)

如有更好算法,欢迎评论区留言O(∩_∩)O

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值