题目三十三:乘积最大

目录

题目:

分析:

程序:

题目:

给定 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))

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值