思路:先对数组排好序,然后利用双指针进行处理,假如两个负数的乘积大于等于两个正数的乘积,那么取负数的乘积,因为后面可能还要用到正数的值;否则就取数值最大的数。详见代码。
题目:
资源限制
时间限制: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)