目录
题目:
给定 N 个整数 A1,A2,…AN。
请你从中选出 K 个数,使其乘积最大。
请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 1000000009 的余数。
注意,如果 X<0, 我们定义 X 除以 1000000009 的余数是负(−X)除以 1000000009 的余数,即:0−((0−x)%1000000009)
输入格式
第一行包含两个整数 N 和 K。
以下 N 行每行一个整数 Ai。
输出格式
输出一个整数,表示答案。
数据范围
1≤K≤N≤105,
−105≤Ai≤105
输入样例1:
5 3
-100000
-10000
2
100000
10000
输出样例1:
999100009
输入样例2:
5 3
-100000
-100000
-2
-100000
-100000
输出样例2:
-999999829
分析:
这道题目读完题之后,第一想法就是它肯定是要分类讨论的。我的想法儿是
1.首先根据输入的整数的个数来循环输入每一个整数。
2.根据题目可知,乘积最大值的取值肯定是要分情况的,即K是否是偶数。
(K为偶数时,乘积最大一定为偶数;K为奇数时,乘积最大值又与正负数的个数有关。
比如K为3,N为5时,整数为2个,负数3个,那么乘积最大为负数;正数3个,负数2个, 那么最大乘积为正数。)
3.容易知道,负负得正,那么最简单的逻辑一定要先把两两相乘的情况表示出来。要注意, 在两两相乘的时候,第一个数和第二个数的乘积一定不会和第一个数和第三个数的乘积同 时存在,这个题要最大值,所以这里取这两个数的较大值。
4.根据K值的奇偶性来判断是否需要取单个数来乘积。
程序:
AZ = []
AF = []
N,K = map(int,input('请输入你想要查找的数字个数N以及最大乘积数字的个数:').split(','))
for i in range(N):
n = int(input('请输入第{}个整数:'.format(i+1)))
if n > 0:
AZ.append(n)
else:
AF.append(n)
#对正数序列以及负数序列进行排序
AZ.sort()
AF.sort()
#保存两两相乘的结果
A_list = []
for i in range(len(AZ)):
sum = 0
for j in range(i+1,len(AZ)):
if sum <= AZ[i]*AZ[j]:
sum = AZ[i]*AZ[j]
A_list.append(sum)
for i in range(len(AF)):
sum = 0
for j in range(i + 1, len(AF)):
if sum <= AF[i] * AF[j]:
sum = AF[i] * AF[j]
A_list.append(sum)
A_list.sort()
print(A_list)
#首先正数序列是否为空,再根据K值的奇偶性来进行乘积最大值的判断。
#这里判断正数序列是否为空的目的是:来决定当K值为奇数的时候,最后一个单独的数乘正数还是偶数。
Prosum = 1
if len(AZ)>0:
if K%2==0:
for i in range(int(K/2)):
Prosum *= max(A_list)
A_list.remove(max(A_list))
else:
for i in range(int(K/2)):
Prosum *= max(A_list)
A_list.remove(max(A_list))
Prosum *=max(AZ)
print(str(abs(Prosum) % 1000000009))
else:
if K%2==0:
for i in range(int(K/2)):
Prosum *= max(A_list)
A_list.remove(max(A_list))
else:
for i in range(int(K/2)):
Prosum *= max(A_list)
A_list.remove(max(A_list))
Prosum *=max(AF)
print('-'+str(abs(Prosum)%1000000009))